如何在matplotlib中提取颜色映射的子集作为新的颜色映射?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (19)

我想使用matplotlib中的颜色映射,例如cmrmap。但我不想在开头用“黑色”,在结尾用“白色”。我有兴趣用中间的颜色来绘制我的数据。我认为ppl经常使用它,但我在网上搜索,无法找到任何简单的解决方案。如果有人提出解决方案,我会很感激的。

提问于
用户回答回答于

可用于创建新的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()

用户回答回答于

试着使用vminvmax绘图函数中的关键字参数。例如,假设您有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)

这可能不能完全解决你的问题,但如果你喜欢一个特定的颜色图,并且希望它两端都有更多的颜色,它可能是有用的。

首先,

import matplotlib.cm as cm
cdict = cm.get_cmap('spectral_r')._segmentdata

这将返回构成颜色映射的所有颜色的字典。

((0.0, 0.0, 0.0)
 (0.5, 1.0, 1.0),...

如果要更改开始和结束颜色,请尝试

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。

spectral_r颜色图为纯白色:

# 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)

扫码关注云+社区