将值映射到matplotlib中的颜色

gen*_*mic 16 python matplotlib

我有一个数字列表如下:

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]
Run Code Online (Sandbox Code Playgroud)

我想将这些数字转换为颜色以供显示.我想要灰度,但当我使用这些数字时,它给了我一个错误:

ValueError: to_rgba: Invalid rgba arg "1.35252299785"
to_rgb: Invalid rgb arg "1.35252299785"
gray (string) must be in range 0-1 
Run Code Online (Sandbox Code Playgroud)

...我明白是因为它超过了1.

我接下来试图将列表中的项目除以列表中的最大数字,以给出小于1的值.但是这给出了非常窄的颜色标度,几乎没有值之间的任何差异.

有什么方法可以给出一些最小和最大范围的颜色并将这些值转换为颜色?我正在使用matplotlib.

mfi*_*tzp 22

matplotlib.colors模块是您正在寻找的.这提供了许多类,可以从值映射到colourmap值.

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))
Run Code Online (Sandbox Code Playgroud)

一般方法是在您的数据中找到minimamaxima.使用这些来创建Normalize实例(其他规范化类可用,例如对数比例).接下来,ScalarMappable使用Normalize实例和您选择的色彩映射创建一个.然后,您可以使用mapper.to_rgba(v)从输入值v(通过标准化比例)到目标颜色进行映射.

for v in sorted(lst):
    print("%.4f: %.4f" % (v, mapper.to_rgba(v)[0]) )
Run Code Online (Sandbox Code Playgroud)

产生输出:

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
Run Code Online (Sandbox Code Playgroud)

如果需要,matplotlib.colors 模块文档包含更多信息.