【发布时间】:2017-01-23 12:22:23
【问题描述】:
在 matplotlib 中,我想在某个特定的值区间内更改颜色条的颜色。例如,我想更改地震颜色条,让 -0.5 和 0.5 之间的值变成白色,我该怎么做?
非常感谢
【问题讨论】:
-
你写过一些可以发布的代码吗?
标签: matplotlib colorbar
在 matplotlib 中,我想在某个特定的值区间内更改颜色条的颜色。例如,我想更改地震颜色条,让 -0.5 和 0.5 之间的值变成白色,我该怎么做?
非常感谢
【问题讨论】:
标签: matplotlib colorbar
您基本上需要创建自己的颜色映射表,以包含您想要的特定功能。当然,这样做时可以使用现有的颜色图。
颜色图始终介于 0 和 1 之间。然后,此范围将映射到数据间隔。因此,为了在-0.5 和0.5 之间创建白色,我们需要知道数据的范围——假设数据从-1 到1。然后我们可以决定让地震图的下部(蓝色)从-1 到-0.5,然后在-0.5 和+0.5 之间设置白色,最后地震图的上部(红色)从0.5 到 1。在颜色图的语言中,这对应于范围[0,0.25]、[0.25, 0.75] 和[0.75,1]。然后我们可以创建一个列表,前 25% 和最后 25% 是地震图的颜色,中间 50% 是白色。
此列表可用于创建颜色图,使用 matplotlib.colors.LinearSegmentedColormap.from_list("colormapname", listofcolors)。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors
n=50
x = 0.5
lower = plt.cm.seismic(np.linspace(0, x, n))
white = plt.cm.seismic(np.ones(100)*0.5)
upper = plt.cm.seismic(np.linspace(1-x, 1, n))
colors = np.vstack((lower, white, upper))
tmap = matplotlib.colors.LinearSegmentedColormap.from_list('terrain_map_white', colors)
x = np.linspace(0,10)
X,Y = np.meshgrid(x,x)
z = np.sin(X) * np.cos(Y*0.4)
fig, ax = plt.subplots()
im = ax.imshow(z, cmap=tmap)
plt.colorbar(im)
plt.show()
对于更一般的情况,您可能需要颜色标准化(使用matplotlib.colors.Normalize)。参见例如this example,其中颜色图中的某种颜色始终固定为数据值 0,与数据范围无关。
【讨论】: