将 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)
如何更改颜色图颜色方案以显示超出一个点的相同颜色。
例如这是我的颜色图:
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()
我认为您不应该更改颜色图,而应该更改使用颜色图的 对象。不久前我问了一个类似的问题:
例如,如果您在绘图中使用等高线,您应该这样做:
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)