我想使用matplotlib中的颜色映射,例如CMRmap。但我不想在开头使用“黑色”,在结尾使用“白色”。我对使用中间颜色绘制数据感兴趣。我想ppl经常使用它,但我在网上搜索,找不到任何简单的解决方案。如果有人提出任何解决方案,我将不胜感激。
静态方法的颜色。LinearSegmentedColormap。from_list可用于创建新的LinearSegmentedColormaps。下面,我在0.2和0.8之间的100个点处对原始颜色贴图进行采样:
cmap(np.linspace(0.2, 0.8, 100))
并使用这些颜色生成新的颜色贴图:
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import numpy as np
def truncate_colormap(cmap, minval=0.0, maxval=1.0, n=100):
new_cmap = colors.LinearSegmentedColormap.from_list(
'trunc({n},{a:.2f},{b:.2f})'.format(n=cmap.name, a=minval, b=maxval),
cmap(np.linspace(minval, maxval, n)))
return new_cmap
arr = np.linspace(0, 50, 100).reshape((10, 10))
fig, ax = plt.subplots(ncols=2)
cmap = plt.get_cmap('jet')
new_cmap = truncate_colormap(cmap, 0.2, 0.8)
ax[0].imshow(arr, interpolation='nearest', cmap=cmap)
ax[1].imshow(arr, interpolation='nearest', cmap=new_cmap)
plt.show()
左侧的绘图显示了使用原始颜色贴图的图像(在本例中,jet
)。右侧的绘图使用new\u cmap
显示相同的图像。
我只是最近一个人在努力。以下是一些可能的解决方案:
尝试在绘图函数中使用vmin
,vmax
关键字参数。例如,假设您的数据介于0和1之间,但不喜欢在0和1的颜色贴图的极端使用的颜色。
import matplotlib.pyplot as plt
import matplotlib.cm as cm
my_cmap = cm.spectral_r
my_cmap.set_over('c')
my_cmap.set_under('m')
plt.pcolor(data, vmin=0.01, vmax=0.99, cmap=my_cmap)
这将迫使整个颜色图用于0.01和0.99之间的值,上面和下面的值将分别是青色和品红色。这可能不能完全解决你的问题,但是如果你喜欢一个特定的颜色贴图,并且希望它在两端都有额外的颜色,它可能会很有用。
如果您真的想更改颜色映射,请查看此处的文档以及此处的LinearSegmentedColormap。
首先,
import matplotlib.cm as cm
cdict = cm.get_cmap('spectral_r')._segmentdata
这将返回组成颜色图的所有颜色的字典。然而,要弄清楚如何修改这本字典是相当棘手的。这个命令有三个键,red, green, Blue
。c的[key]
返回一个形式为(x, y0, y1)
的值列表。让我们来看看的两个连续的元素['red']
:
((0.0, 0.0, 0.0)
(0.5, 1.0, 1.0),...
这意味着z
(假设我们正在执行pcolor
或imshow
)介于0.0和0.5之间的数据,与该数据相关的rgb颜色的红色分量将从0.0(无红色)增加到1.0(最大红色)。这意味着要更改colormap的颜色,您必须检查rgb的三个分量中的每一个是如何在您感兴趣的colormap区域内插值的。只需确保对于每种颜色,第一个和最后一个条目分别以x=0
和x=1
开头;您必须覆盖[0,1]的整个范围。
如果要更改开始和结束颜色,请尝试
import matplotlib.cm as cm
from matplotlib.colors import LinearSegmentedColormap
cdict = cm.get_cmap('spectral_r')._segmentdata
cdict['red'][0] = (0, 0.5, 0.5) # x=0 for bottom color in colormap
cdict['blue'][0] = (0, 0.5, 0.5) # y=0.5 gray
cdict['green'][0] = (0, 0.5, 0.5) # y1=y for simple interpolation
cdict['red'][-1] = (1, 0.5, 0.5) # x=1 for top color in colormap
cdict['blue'][-1] = (1, 0.5, 0.5)
cdict['green'][-1] = (1, 0.5, 0.5)
my_cmap = LinearSegmentedColormap('name', cdict)
然后在绘图函数中使用此cmap。
我想做的是将spectrum\u r
colormap末尾的灰色更改为纯白色。这是通过使用
# Using imports from above
cdict = matplotlib.cm.get_cmap('spectral_r')._segmentdata
cdict['red'][0] = (0, 1, 1)
cdict['green'][0] = (0, 1, 1)
cdict['blue'][0] = (0, 1, 1)
my_cmap = LinearSegmentedColormap('my_cmap', cdict)
在我的CMasher包中,我提供了get\u sub\u cmap()
-函数(https://cmasher.readthedocs.io/user/usage.html#sub-colormaps),它接受一个colormap和一个范围,并返回一个包含请求范围的新colormap。
因此,例如,如果您希望采用viridis
colormap的20%到80%之间的颜色,您可以使用:
import cmasher as cmr
cmap = cmr.get_sub_cmap('viridis', 0.2, 0.8)
注意:不要使用jet
(或CMRmap
),因为它们在感知上不是一致的。相反,请使用matplotlib中的5个正确的颜色贴图,或使用cmocean或my CMasher提供的颜色贴图。
编辑:在最新版本的CMasher中,还可以使用相同的函数,通过向函数提供要获取的段数,从任何颜色映射中创建离散/定性颜色映射。例如,如果要创建20%到80%范围内的viridis
定性颜色图,可以使用以下方法:
cmap = cmr.get_sub_map('viridis', 0.2, 0.8, N=5)