我正在尝试通过操作这个示例从 matplotlib 颜色图中提取离散颜色。但是,我找不到从颜色图中提取的
N
离散颜色。
在下面的代码中我使用了
cmap._segmentdata
,但我发现它是整个颜色图的定义。给定一个颜色图和一个整数 N
,如何从颜色图中提取 N
离散颜色并以十六进制格式导出它们?
from pylab import *
delta = 0.01
x = arange(-3.0, 3.0, delta)
y = arange(-3.0, 3.0, delta)
X,Y = meshgrid(x, y)
Z1 = bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
Z = Z2 - Z1 # difference of Gaussians
cmap = cm.get_cmap('seismic', 5) # PiYG
cmap_colors = cmap._segmentdata
def print_hex(r,b,g):
if not(0 <= r <= 255 or 0 <= b <= 255 or 0 <= g <= 255):
raise ValueError('rgb not in range(256)')
print '#%02x%02x%02x' % (r, b, g)
for i in range(len(cmap_colors['blue'])):
r = int(cmap_colors['red'][i][2]*255)
b = int(cmap_colors['blue'][i][2]*255)
g = int(cmap_colors['green'][i][2]*255)
print_hex(r, g, b)
im = imshow(Z, cmap=cmap, interpolation='bilinear',
vmax=abs(Z).max(), vmin=-abs(Z).max())
axis('off')
colorbar()
show()
您可以通过调用
i
获取索引为 cmap(i)
的段的 rgba 值元组。还有一个函数可以将 RGB 值转换为十六进制。正如 Joe Kington 在评论中所写,您可以使用 matplotlib.colors.rgb2hex
。因此,一个可能的解决方案是:
from pylab import *
cmap = cm.get_cmap('seismic', 5) # PiYG
for i in range(cmap.N):
rgba = cmap(i)
# rgb2hex accepts rgb or rgba
print(matplotlib.colors.rgb2hex(rgba))
输出为:
#00004c
#0000ff
#ffffff
#ff0000
#7f0000
供将来参考:我的 CMasher 包提供了一个名为
take_cmap_colors()
的函数(https://cmasher.readthedocs.io/user/usage.html#take-colormap-colors),它允许人们采用任意数量的离散颜色来自给定颜色图的颜色并以它们想要的任何格式(8 位、标准化或十六进制)返回它们。
因此,例如,如果您想从
viridis
颜色图中获取 5 种十六进制颜色,您可以使用:
import cmasher as cmr
colors = cmr.take_cmap_colors('viridis', 5, return_fmt='hex')
或者如果您想要特定值范围内的颜色图中的所有十六进制颜色,您可以使用以下方法来实现:
colors = cmr.take_cmap_colors('viridis', None, cmap_range=(0.2, 0.8), return_fmt='hex')
由于
cm.get_cmap
自 Matplotlib 版本 3.7 起已被弃用,你可以这样做
import matplotlib as mpl
import numpy as np
for step in np.linspace(0, 1, 5):
print(mpl.colors.rgb2hex(cmap(step)))