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

问题描述 投票:79回答:2

如果你有一个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)
python matplotlib colors
2个回答
140
投票

您可以使用下面的代码执行此操作,并且您的问题中的代码实际上非常接近您所需的代码,您所要做的就是调用您拥有的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提供有关如何改进答案的建议。)


4
投票

为了获得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
© www.soinside.com 2019 - 2024. All rights reserved.