如果你有一个Colormap cmap,例如:
cmap = matplotlib.cm.get_cmap('Spectral')
在0和1之间,0是地图上的第一种颜色,1是地图上的最后一种颜色,你如何从0和1之间得到特定的颜色?
理想情况下,我可以通过这样做来获得地图中的中间颜色:
>>> do_some_magic(cmap, 0.5) # Return an RGBA tuple
(0.1, 0.2, 0.3, 1.0)
如果你有一个Colormap cmap,例如:
cmap = matplotlib.cm.get_cmap('Spectral')
在0和1之间,0是地图上的第一种颜色,1是地图上的最后一种颜色,你如何从0和1之间得到特定的颜色?
理想情况下,我可以通过这样做来获得地图中的中间颜色:
>>> do_some_magic(cmap, 0.5) # Return an RGBA tuple
(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。Nan和np。Inf默认是使用0.0值,这可以使用cmap.set_bad()进行更改,类似于上面的under和over。
最后,您可能需要对数据进行规范化,使其符合范围[0.0,1.0]。这可以使用matplotlib.colors.Normalize简单地完成,如下图所示,其中参数vmin和vmax分别描述了应该映射到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)也可用于具有较大值范围的数据范围。
(感谢乔·金顿和tcaswell对如何改进答案的建议。)
其他回答
您可以使用下面的代码来实现这一点,您问题中的代码实际上非常接近您所需要的,您所要做的就是调用您所拥有的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。Nan和np。Inf默认是使用0.0值,这可以使用cmap.set_bad()进行更改,类似于上面的under和over。
最后,您可能需要对数据进行规范化,使其符合范围[0.0,1.0]。这可以使用matplotlib.colors.Normalize简单地完成,如下图所示,其中参数vmin和vmax分别描述了应该映射到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)也可用于具有较大值范围的数据范围。
(感谢乔·金顿和tcaswell对如何改进答案的建议。)
为了得到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
对于一个快速和肮脏的你可以直接使用地图。 或者你可以按照@amaliammr说的去做。
data_size = 23 # range 0..23
colors = plt.cm.turbo
color_normal = colours.N/data_size
for i in range(data_size):
col = colours.colors[int(i*color_normal)]
颜色地图有自己的标准化方法,所以如果你已经有了一个图,你可以在某个值访问颜色。
import matplotlib.pyplot as plt
import numpy as np
cmap = plt.cm.viridis
cm = plt.pcolormesh(np.random.randn(10, 10), cmap=cmap)
print(cmap(cm.norm(2.2)))
我曾经遇到过类似的情况,我需要“n”不。这样我就可以将每种颜色分配给我的数据。 我已经在一个名为“mycolorpy”的包中编译了一个代码。 你可以使用pip安装它:
pip install mycolorpy
你可以这样做:
from mycolorpy import colorlist as mcp
import numpy as np
示例:从cmap "winter"中创建5个十六进制字符串的列表
color1=mcp.gen_color(cmap="winter",n=5)
print(color1)
输出:
['#0000ff', '#0040df', '#0080bf', '#00c09f', '#00ff80']
另一个从cmap bwr生成16种颜色列表的例子:
color2=mcp.gen_color(cmap="bwr",n=16)
print(color2)
输出:
['#0000ff', '#2222ff', '#4444ff', '#6666ff', '#8888ff', '#aaaaff', '#ccccff', '#eeeeff', '#ffeeee', '#ffcccc', '#ffaaaa', '#ff8888', '#ff6666', '#ff4444', '#ff2222', '#ff0000']
有一个python笔记本,其中有使用示例,可以更好地可视化这一点。
假设您想要从规范化为给定数据的cmap中生成一个颜色列表。你可以使用:
a=random.randint(1000, size=(200))
a=np.array(a)
color1=mcp.gen_color_normalized(cmap="seismic",data_arr=a)
plt.scatter(a,a,c=color1)
输出:
你也可以反转颜色使用:
color1=mcp.gen_color_normalized(cmap="seismic",data_arr=a,reverse=True)
plt.scatter(a,a,c=color1)
输出: