修改Python色彩地图以使特定点之后的颜色值为单一值

6

如何将颜色地图调色板更改为在一个点之后显示相同的颜色。

例如,这是我的颜色地图:

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

如果我使用这个颜色地图来绘制0到100的范围,我该如何修改颜色地图,使得超过50后颜色变为红色?


你有这个目的的样本数据吗?能否在问题中也包含它? - Nickil Maveli
1
但是您正在使用的颜色映射将绿色作为上限。您能否澄清您想要保留哪些颜色? - Nickil Maveli
5个回答

12

你可以通过在一起堆叠两个不同的色图来为给定范围(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()

Image1

如果您想让上部分与颜色相同并不在颜色地图的整个长度上扩展,您可以进行以下修改:

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

Image2


3

cmap.set_over("red")

这行代码用于设置颜色映射,将超出范围的值设为红色。

如果要设置特定边界值,您可以使用norm函数之一。如果使用imshow函数,您还可以设置vmin=50参数,使其成为顶部值。


3
您可以使用以下命令从现有的调色板创建一个新的调色板:
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()

Plot uses last color over 50

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

Plot uses red for values over 50


1

我认为你不应该改变色图,而是使用色图的对象。我不久前也问了一个类似的问题:如何更改contourf图形第一级的颜色, 我从这里获得了答案:Python matplotlib 如何更改超出colorbar范围的默认颜色

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

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)

1

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

cmap_dict = cmap._segmentdata

这段话的意思是:通过索引它,可以得到一个字典。同时保留了HTML格式,不进行解释。
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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接