我有一个数字列表,如下所示:
lst = [1.9378076554115014, 1.2084586588892861, 1.2133096565896173, 1.2427632053442292, 1.1809971732733273, 0.91960143581348919, 1.1106310149587162, 1.1106310149587162, 1.1527004351293346, 0.87318084435885079, 1.1666132876686799, 1.1666132876686799]
我想将这些数字转换为颜色以显示。我想要灰度,但是当我按原样使用这些数字时,它给我一个错误:
ValueError: to_rgba: Invalid rgba arg "1.35252299785" to_rgb: Invalid rgb arg "1.35252299785" gray (string) must be in range 0-1
…我了解是因为它超过了1。
接下来,我尝试将列表中具有最高编号的项目划分为小于1的值。但这会产生非常窄的色阶,而值之间几乎没有任何区别。
有什么方法可以给颜色提供最小和最大范围,并将这些值转换为颜色?我正在使用matplotlib。
matplotlib.colors您正在寻找的模块。这提供了许多类来从值映射到颜色图值。
matplotlib.colors
import matplotlib import matplotlib.cm as cm lst = [1.9378076554115014, 1.2084586588892861, 1.2133096565896173, 1.2427632053442292, 1.1809971732733273, 0.91960143581348919, 1.1106310149587162, 1.1106310149587162, 1.1527004351293346, 0.87318084435885079, 1.1666132876686799, 1.1666132876686799] minima = min(lst) maxima = max(lst) norm = matplotlib.colors.Normalize(vmin=minima, vmax=maxima, clip=True) mapper = cm.ScalarMappable(norm=norm, cmap=cm.Greys_r) for v in lst: print(mapper.to_rgba(v))
一般方法是在数据中找到minima和maxima。使用它们创建一个Normalize实例(其他规范化类可用,例如对数刻度)。接下来,ScalarMappable使用Normalize实例和所选的colormap创建一个。然后,您可以mapper.to_rgba(v)用来v通过标准化的比例将输入值映射到目标颜色。
minima
maxima
Normalize
ScalarMappable
mapper.to_rgba(v)
v
for v in sorted(lst): print("%.4f: %.4f" % (v, mapper.to_rgba(v)[0]) )
产生输出:
0.8732: 0.0000 0.9196: 0.0501 1.1106: 0.2842 1.1106: 0.2842 1.1527: 0.3348 1.1666: 0.3469 1.1666: 0.3469 1.1810: 0.3632 1.2085: 0.3875 1.2133: 0.3916 1.2428: 0.4200 1.9378: 1.0000
如果需要,matplotlib.colors 模块文档中有更多信息。