【问题标题】:How does matplotlib custom colormaps workmatplotlib 自定义颜色图如何工作
【发布时间】:2021-12-29 04:44:31
【问题描述】:

我正在尝试使用文档中的示例创建自定义颜色映射,但我不知道如何设置颜色范围。

https://matplotlib.org/2.0.2/examples/pylab_examples/custom_cmap.html

这是最接近我需要的:(全绿从 1.0 到 0.916,全黄从 0.916 到 0.75,全红低于 0.75)

cdict1 = {'red':   ((0.0,  1.0, 1.0),
                   (0.75,  1.0, 1.0),
                   (1.0,  0.0, 0.0)),

         'green': ((0.0,  0.0, 0.0),
                   (0.75, 1.0, 1.0),
                   (0.91666666666, 1.0, 1.0),
                   (1.0,  1.0, 1.0)),

         'blue':  ((0.0,  0.0, 0.0),
                   (0.5,  0.0, 0.0),
                   (1.0,  0.0, 0.0))}

我不明白为什么这个颜色图是颜色之间的平滑过渡。

【问题讨论】:

  • 您正在引用一个非常古老的页面。最新的可以找到here。您似乎想要一个只有 3 种固定颜色但边界不相等的颜色图。这可以纯粹使用颜色图来完成,但标准方式使用 BoundaryNorm
  • @JohanC 经过一些调整,我能够解决这个问题,但我仍然对这些值如何相互对应一无所知。
  • LinearSegmentedColormap 是一个相当复杂的函数,并不那么直观。

标签: python matplotlib colormap


【解决方案1】:

要创建具有不等边界的 3 种固定颜色的颜色图,推荐的方法是使用 BoundaryNorm

如果您真的只想使用颜色图,您可以创建一个from a list of colors

LinearSegmentedColormap 在给定值下使用特定颜色进行平滑过渡。为了使其与固定颜色一起使用,可以将这些值设置为相等。该函数可以使用“旧”方式操作 rgb 值,也可以使用 (value, color) 对列表 (LinearSegmentedColormap.from_list())。

以下示例代码显示了它是如何工作的:

import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap, BoundaryNorm, LinearSegmentedColormap
import numpy as np

x, y = np.random.rand(2, 100)
fig, (ax1, ax2, ax3) = plt.subplots(ncols=3, figsize=(14, 4))

# working with a BoundaryNorm
cmap1 = ListedColormap(['red', 'yellow', 'green'])
norm1 = BoundaryNorm([0, 0.75, 0.916, 1], ncolors=3)
scat1 = ax1.scatter(x, y, c=y, cmap=cmap1, norm=norm1)
plt.colorbar(scat1, ax=ax1, spacing='proportional')
ax1.set_title('working with BoundaryNorm')

# creating a special colormap
colors = ['green' if c > 0.916 else 'red' if c < 0.75 else 'yellow' for c in np.linspace(0, 1, 256)]
cmap2 = ListedColormap(colors)
scat2 = ax2.scatter(x, y, c=y, cmap=cmap2, vmin=0, vmax=1)
plt.colorbar(scat2, ax=ax2)
ax2.set_title('special list of colors')

cmap3 = LinearSegmentedColormap.from_list('', [(0, 'red'), (0.75, 'red'), (0.75, 'yellow'), (0.916, 'yellow'),
                                               (0.916, 'green'), (1, 'green')])
scat3 = ax3.scatter(x, y, c=y, cmap=cmap3, vmin=0, vmax=1)
plt.colorbar(scat3, ax=ax3)
ax3.set_title('LinearSegmentedColormap')

plt.tight_layout()
plt.show()

plt.colorbarspacing='proportional' 选项显示其比例位置的边界。默认显示 3 个等距边界和值。

【讨论】:

    猜你喜欢
    • 2021-05-03
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多