matplotlib bwr-colormap,始终以零为中心

新手上路,请多包涵

我正在尝试绘制一个包含正数和负数的矩阵。数字将在 -1 到 1 的区间内,但不在完整范围内。例如,数字有时可能在 -0.2 到 +0.8 的范围内(参见下面的代码)。我想使用 bwr-colormap(蓝色 -> 白色 - 红色),这样零总是用白色进行颜色编码。 -1 应该用尽可能深的蓝色进行颜色编码,+1 应该用尽可能深的红色进行颜色编码。这是一个示例,其中两个图只能通过其颜色条来区分。

 import numpy
from matplotlib import pyplot as plt

# some arbitrary data to plot
x = numpy.linspace(0, 2*numpy.pi, 30)
y = numpy.linspace(0, 2*numpy.pi, 20)
[X, Y] = numpy.meshgrid(x, y)
Z = numpy.sin(X)*numpy.cos(Y)

fig = plt.figure()
plt.ion()
plt.set_cmap('bwr') # a good start: blue to white to red colormap

# a plot ranging from -1 to 1, hence the value 0 (the average) is colorcoded in white
ax = fig.add_subplot(1, 2, 1)
plt.pcolor(X, Y, Z)
plt.colorbar()

# a plot ranging from -0.2 to 0.8 hence 0.3 (the average) is colorcoded in white
ax = fig.add_subplot(1, 2, 2)
plt.pcolor(X, Y, Z*0.5 + 0.3)   # rescaled Z-Data
plt.colorbar()

这段代码创建的图形可以在这里看到:图用发布的代码创建

如上所述,我正在寻找一种始终使用相同颜色对值进行颜色编码的方法,其中 -1:深蓝色,0:白色,+1:深红色。这是单行本,我遗漏了什么,还是我必须为此自己写点什么?

编辑:再挖一点之后,我自己找到了一个令人满意的答案,没有触及颜色图,而是使用可选输入 pcolor (见下文)。不过,我不会删除这个问题,因为在我发布这个问题并点击相关问题/答案之前,我找不到关于 SO 的答案。另一方面,我不介意它是否被删除,因为如果有人正在寻找正确的关键字,那么可以在其他地方找到这个问题的确切答案。

原文由 Nras 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

显然,经过更长时间的挖掘,我自己找到了答案。 pcolor 提供可选输入 vminvmax 。如果我将它们分别设置为 -1 和 1,它就完全解决了问题。颜色编码似乎与 vmin 和 vmax 有关,而不是与绘制的数据的最小值和最大值有关。因此,将绘图命令(和注释)更改为

# a plot ranging from -1 to 1, where the value 0 is colorcoded in white
ax = fig.add_subplot(1, 2, 1)
plt.pcolor(X, Y, Z, vmin=-1, vmax=1) # vmin, vmax not needed here
plt.colorbar()

# a plot ranging from -0.2 to 0.8, where the value 0 is colorcoded in white
ax = fig.add_subplot(1, 2, 2)
plt.pcolor(X, Y, Z*0.5 + 0.3, vmin=-1, vmax=1)   # rescaled Z-Data
plt.colorbar()

它会根据我的需要生成一个图形:正确的数字

因此,设置 vmin=-1, vmax=1 就可以完成工作,我不必更改颜色图本身的内容。

原文由 Nras 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以像这样使用 matplotlib.colors.TwoSlopeNorm:

 # define your scale, with white at zero
vmin = -0.2
vmax = 0.8
norm = colors.TwoSlopeNorm(vmin=vmin, vcenter=0, vmax=vmax)

在你的例子中,

 import numpy
from matplotlib import pyplot as plt
import matplotlib.colors as colors

# some arbitrary data to plot
x = numpy.linspace(0, 2*numpy.pi, 30)
y = numpy.linspace(0, 2*numpy.pi, 20)
[X, Y] = numpy.meshgrid(x, y)
Z = numpy.sin(X)*numpy.cos(Y)

fig = plt.figure()
plt.ion()
plt.set_cmap('bwr') # a good start: blue to white to red colormap

# a plot ranging from -1 to 1, hence the value 0 (the average) is colorcoded in white
ax = fig.add_subplot(1, 2, 1)
plt.pcolor(X, Y, Z)
plt.colorbar()

# a plot ranging from -0.2 to 0.8 hence 0.3 (the average) is colorcoded in white
ax = fig.add_subplot(1, 2, 2)

# define your scale, with white at zero
vmin = -0.2
vmax = 0.8
norm = colors.TwoSlopeNorm(vmin=vmin, vcenter=0, vmax=vmax)

plt.pcolor(X, Y, Z, vmin=vmin, vmax=vmax, norm=norm)
plt.colorbar()

会给你:

在此处输入图像描述

原文由 aerijman 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏