从matplotlib中的颜色贴图中获取单个颜色

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从matplotlib中的颜色贴图中获取单个颜色相关的知识,希望对你有一定的参考价值。

如果你有一个Colormap

cmap = matplotlib.cm.get_cmap('Spectral')

如何在0和1之间获得特定的颜色,其中0.0是地图中的第一种颜色,1.0是地图中的最后一种颜色?

理想情况下,我可以通过以下方式获得地图中的中间颜色:

>>> do_some_magic(cmap, 0.5) # Return an RGBA tuplet
(0.1, 0.2, 0.3, 1.0)
答案

您可以使用下面的代码执行此操作,并且您的问题中的代码实际上非常接近您所需的代码,您所要做的就是调用您拥有的cmap对象。

import matplotlib

cmap = matplotlib.cm.get_cmap('Spectral')

rgba = cmap(0.5)
print(rgba) # (0.99807766255210428, 0.99923106502084169, 0.74602077638401709, 1.0)

对于范围[0.0,1.0]之外的值,它将返回欠色和高色(分别)。默认情况下,这是范围内的最小和最大颜色(因此0.0和1.0)。可以使用cmap.set_under()cmap_set_over()更改此默认值。

对于“特殊”数字,例如np.nannp.inf,默认是使用0.0值,这可以使用cmap.set_bad()更改,类似于上面的under和over。

最后,您可能需要对数据进行标准化,使其符合范围[0.0, 1.0]。这可以使用matplotlib.colors.Normalize完成,只需如下面的小例子所示,其中参数vminvmax分别描述了应该映射到0.0和1.0的数字。

import matplotlib

norm = matplotlib.colors.Normalize(vmin=10.0, vmax=20.0)

print(norm(15.0)) # 0.5

对数标准化器(matplotlib.colors.LogNorm)也可用于具有大范围值的数据范围。

(感谢Joe Kingtontcaswell提供有关如何改进答案的建议。)

另一答案

为了获得rgba整数值而不是浮点值,我们可以做到

rgba = cmap(0.5,bytes=True)

因此,为了根据Ffisegydd的答案简化代码,代码将是这样的:

#import colormap
from matplotlib import cm

#normalize item number values to colormap
norm = matplotlib.colors.Normalize(vmin=0, vmax=1000)

#colormap possible values = viridis, jet, spectral
rgba_color = cm.jet(norm(400),bytes=True) 

#400 is one of value between 0 and 1000

以上是关于从matplotlib中的颜色贴图中获取单个颜色的主要内容,如果未能解决你的问题,请参考以下文章

从 matplotlib 中的颜色图中获取单个颜色

Matplotlib 3.3.3:更改单个刻度的颜色不再起作用

从 matplotlib 中的图形中删除颜色条

使用 matplotlib 更改小提琴图中单个最大和平均线的颜色

如何从matplotlib中的图形中检索颜色条实例

使用颜色条删除图像不会释放 matplotlib 中的内存?