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

新手上路,请多包涵

我想使用来自 matplotlib 的颜色图,例如 CMRmap。但我不想在开头使用“黑色”,在结尾使用“白色”。我有兴趣使用中间颜色绘制我的数据。我认为人们经常使用它,但我正在通过互联网进行搜索,但无法找到任何简单的解决方案。如果有人提出任何解决方案,我将不胜感激。

原文由 rana 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 664
2 个回答

静态 方法 colors.LinearSegmentedColormap.from_list 可用于创建新的 LinearSegmentedColormap。下面,我在 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_cmap 显示相同的图像。

原文由 unutbu 发布,翻译遵循 CC BY-SA 3.0 许可协议

在我的 CMasher 包中,我提供了 get_sub_cmap() 函数 ( https://cmasher.readthedocs.io/user/usage.html#sub-colormaps ),它接受一个颜色图和一个范围,并返回一个包含请求范围的新颜色图。

因此,例如,如果您想要获取 viridis 颜色图的 20% 到 80% 之间的颜色,您可以使用以下方法实现:

 import cmasher as cmr

cmap = cmr.get_sub_cmap('viridis', 0.2, 0.8)

PS:不要使用 jet (或 CMRmap ),因为它们在感知上不是连续的。相反,使用 matplotlib 中的 5 个正确的颜色图或 cmocean 或我的 CMasher 提供的颜色图。

编辑:在最新版本的 CMasher 中,还可以使用相同的函数通过为函数提供要采用的段数来从任何颜色图中创建离散/定性颜色图。例如,如果你想创建 viridis 在 20% 到 80% 范围内的定性颜色图,你可以这样做:

 cmap = cmr.get_sub_map('viridis', 0.2, 0.8, N=5)

原文由 1313e 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题