将 python 色图修改为超出特定点的单个值

Modifying python colormaps to single value beyond a specific point

如何更改颜色图颜色方案以显示超出一个点的相同颜色。

例如这是我的颜色图:

import palettable
cmap = palettable.colorbrewer.sequential.YlGn_9.mpl_colormap

如果我使用此颜色图绘制 0 到 100 的范围,我如何修改颜色图以使其超过 50 时变为红色?

cmap.set_over("red")

您可能想使用 norm functions 之一来设置您的特定界限。如果使用 imshow,您还可以设置参数 vmin=50 使其成为您的最高值。

您可以通过以下方式访问颜色:

cmap_dict = cmap._segmentdata

生成字典。通过索引它:

red = cmap_dict["red"]
green= cmap_dict["green"]
blue = cmap_dict["blue"]
alpha = cmap_dict["alpha"]

现在您可以像这样从列表中添加颜色:

red .append(red [1])

用 4 个键将它们重新组合成一个字典,例如:

cmap_dict_new["red"] = red

并创建一个新的颜色图:

new_cmap = palettable.palette.ListedColormap(cmap_dict_new)

您可以通过将两个不同的颜色图堆叠在一起来创建给定范围 (0 →100) 的颜色图,如图所示:

插图:

import numpy as np
import matplotlib.pyplot as plt
import palettable
import matplotlib.colors as mcolors

# Set random seed
np.random.seed(42)

# Create random values of shape 10x10
data = np.random.rand(10,10) * 100 

# Given colormap which takes values from 0→50
colors1 = palettable.colorbrewer.sequential.YlGn_9.mpl_colormap(np.linspace(0, 1, 256))
# Red colormap which takes values from 50→100
colors2 = plt.cm.Reds(np.linspace(0, 1, 256))

# stacking the 2 arrays row-wise
colors = np.vstack((colors1, colors2))

# generating a smoothly-varying LinearSegmentedColormap
cmap = mcolors.LinearSegmentedColormap.from_list('colormap', colors)

plt.pcolor(data, cmap=cmap)
plt.colorbar()
# setting the lower and upper limits of the colorbar
plt.clim(0, 100)

plt.show()

如果你希望上半部分是相同的颜色而不是散布在颜色图的长度上,你可以进行以下修改:

colors2 = plt.cm.Reds(np.linspace(1, 1, 256))

您可以使用以下方法从现有颜色图创建新颜色图:

newcmap = cmap.from_list('newcmap',list(map(cmap,range(50))), N=50)

对于超过 50 种颜色,此新地图使用颜色图中的最后一个值。要使最后一种颜色变为红色,我们可以将红色附加到定义颜色图的列表中的最后一种颜色。

newcmap = cmap.from_list('newcmap',list(map(cmap,range(50)))+[(1,0,0,1)], N=51)

import palettable
from matplotlib import pyplot as plt
cmap = palettable.colorbrewer.sequential.YlGn_9.mpl_colormap

newcmap = cmap.from_list('newcmap',list(map(cmap,range(50))), N=50)
for x in range(80):
    plt.bar(x,1, width=1, edgecolor='none',facecolor=newcmap(x))
plt.show()

newcmap = cmap.from_list('newcmap',list(map(cmap,range(50)))+[(1,0,0,1)], N=51)
for x in range(80):
    plt.bar(x,1, width=1, edgecolor='none',facecolor=newcmap(x))
plt.show()

我认为您不应该更改颜色图,而应该更改使用颜色图的 对象。不久前我问了一个类似的问题:, and I took the answer from here: Python matplotlib change default color for values exceeding colorbar range

例如,如果您在绘图中使用等高线,您应该这样做:

cs = pyplot.contourf(x,y,z, cmap=your_cmap)
cs.cmap.set_over('r')  # Change color to red
cs.set_clim(0, 50)  # Set the limit beyond which everything is red
cb = pyplot.colorbar(cs)  # Plot the colorbar (if needed)