Python 3.x Matplotlib程序中的误解

Python 3.x Matplotlib程序中的误解,python-3.x,matplotlib,colors,Python 3.x,Matplotlib,Colors,我正在使用Matplotlib 3.1.1编写代码“离散分布为水平条形图”,在这里可以找到 这个问题我已经讨论了一段时间了,但我仍然不明白:这个指令是什么意思:category\u colors=plt.get\u cmap('RdYlGn')(np.linspace(0.15,0.85,data.shape[1]) 当np.linspace(0.15,0.85,data.shape[1])解析为数组([0.15,0.325,0.5,0.675,0.85])时,我首先认为该程序使用的是color

我正在使用Matplotlib 3.1.1编写代码“离散分布为水平条形图”,在这里可以找到

这个问题我已经讨论了一段时间了,但我仍然不明白:这个指令是什么意思:
category\u colors=plt.get\u cmap('RdYlGn')(np.linspace(0.15,0.85,data.shape[1])

np.linspace(0.15,0.85,data.shape[1])
解析为
数组([0.15,0.325,0.5,0.675,0.85])
时,我首先认为该程序使用的是
colormap RdYlGn
(应该从color=0.0变为color=1.0),然后使用位于0.15点的5种特定颜色,等等,0.85

但是,打印
category\u colors
解析为
(5,4)数组

array([[0.89888504, 0.30549789, 0.20676663, 1.        ],
       [0.99315648, 0.73233372, 0.42237601, 1.        ],
       [0.99707805, 0.9987697 , 0.74502115, 1.        ],
       [0.70196078, 0.87297193, 0.44867359, 1.        ],
       [0.24805844, 0.66720492, 0.3502499 , 1.        ]])
我不明白这些数字指的是什么???

plt.get_cmap('RdYlGn')
返回一个函数,该函数将0到1之间的数字映射到相应的颜色,其中0映射到红色,0.5映射到黄色,1映射到绿色。通常,此函数的名称为
cmap=plt.get_cmap('RdYlGn')
。然后
cmap(0)
(与
plt.get_cmap('RdYlGn')(0)
)将是
(0.6470588235294118,0.0,0.14901960784313725,1.0)
(红色、绿色、蓝色、alpha
)。在十六进制中,此颜色将为
#a50026

通过numpy的魔力,
cmap(np.array([0.15,0.325,0.5,0.675,0.85])
获得了与
np.array([cmap(0.15),cmap(0.325),…,cmap(0.85)]相同的结果。
。(换句话说,应用于数组的许多numpy函数返回应用于单个元素的该函数的数组。)

因此,
category_colors=cmap(np.linspace(0.15,0.85,5))
的第一行将是对应于值
0.15
0.89888504,0.30549789,0.20676663,1的颜色的rgba值。
。这是一种90%红色、31%绿色和21%蓝色的颜色(对于完全不透明的颜色,
alpha=1
),因此非常红。下一行是对应于
0.325
的rgba值,依此类推

下面是一些代码来说明这些概念:

导入matplotlib.pyplot作为plt
从matplotlib.colors导入到_hex#将颜色转换为十六进制格式
从matplotlib.cm导入创建自定义颜色栏所需的ScalarMapable
将numpy作为np导入
cmap=plt.get_cmap('RdYlGn'))
颜色_值=np.linspace(0.15,0.85,5)
类别颜色=cmap(颜色值)
plt.barh(颜色值,1,高度=0.15,颜色=类别颜色)
plt.yticks(颜色值)
plt.colorbar(ScalarMappable(cmap=cmap),ticks=color\u值)
plt.ylim(0,1)
plt.xlim(0,1.1)
plt.xticks([])
对于val,zip中的颜色(颜色值、类别颜色):
r、 g,b,a=颜色
plt.text(0.1,val,f'r:{r:0.2f}g:{g:0.2f}b:{b:0.2f}a:{a:0.1f}\nhex:{to_hex(color)},va='center')
plt.show()

PS:您可能还想了解将任意范围映射到colormaps使用的范围0,1的函数。

plt.get_cmap('RdYlGn')
返回一个函数,该函数将0到1之间的数字映射到相应的颜色,其中0映射到红色,0.5映射到黄色,1映射到绿色。通常,此函数的名称为
cmap=plt.get_cmap('RdYlGn')
。然后
cmap(0)
(与
plt.get_cmap('RdYlGn')(0)
)将是
(0.6470588235294118,0.0,0.14901960784313725,1.0)
(红色、绿色、蓝色、alpha
)。在十六进制中,此颜色将为
#a50026

通过numpy的魔力,
cmap(np.array([0.15,0.325,0.5,0.675,0.85])
获得了与
np.array([cmap(0.15),cmap(0.325),…,cmap(0.85)]相同的结果。
。(换句话说,应用于数组的许多numpy函数返回应用于单个元素的该函数的数组。)

因此,
category_colors=cmap(np.linspace(0.15,0.85,5))
的第一行将是对应于值
0.15
0.89888504,0.30549789,0.20676663,1的颜色的rgba值。
。这是一种90%红色、31%绿色和21%蓝色的颜色(对于完全不透明的颜色,
alpha=1
),因此非常红。下一行是对应于
0.325
的rgba值,依此类推

下面是一些代码来说明这些概念:

导入matplotlib.pyplot作为plt
从matplotlib.colors导入到_hex#将颜色转换为十六进制格式
从matplotlib.cm导入创建自定义颜色栏所需的ScalarMapable
将numpy作为np导入
cmap=plt.get_cmap('RdYlGn'))
颜色_值=np.linspace(0.15,0.85,5)
类别颜色=cmap(颜色值)
plt.barh(颜色值,1,高度=0.15,颜色=类别颜色)
plt.yticks(颜色值)
plt.colorbar(ScalarMappable(cmap=cmap),ticks=color\u值)
plt.ylim(0,1)
plt.xlim(0,1.1)
plt.xticks([])
对于val,zip中的颜色(颜色值、类别颜色):
r、 g,b,a=颜色
plt.text(0.1,val,f'r:{r:0.2f}g:{g:0.2f}b:{b:0.2f}a:{a:0.1f}\nhex:{to_hex(color)},va='center')
plt.show()


PS:您可能还想了解将任意范围映射到彩色贴图使用的范围0,1的方法。

这些不是RGBA吗?
[0.89888504,0.30549789,0.20676663,1]
表示rgb值(红色=0.89…,绿色=0.30…,蓝色=0.20…,alpha=1,0表示无颜色,1表示全色)。使用
matplotlib.color.to_hex(…)
您可以将其转换为web上使用的十六进制格式(
\e54e35
,一种略带红色的颜色),因此,假设rgb值,那么
np.linspace(0.15,0.85,5)
(作为
数据。形状[1]是5…
,解析为
数组([0.15,0.325,0.5,0.675,0.85]))
,可能会导致一个
(5,4)数组
,每行的rgb值不同?可能是我在plt.get_cmap中不理解的东西,我猜:值0.15,0.325,0.5,0.675,0.85是固定的,不是吗?然而,rgb值在每一行中都不同。。。我是圣