Python 移位颜色条matplotlib
我正在尝试为数据集创建填充轮廓。这应该相当简单:Python 移位颜色条matplotlib,python,colors,matplotlib,Python,Colors,Matplotlib,我正在尝试为数据集创建填充轮廓。这应该相当简单: plt.contourf(x, y, z, label = 'blah', cm = matplotlib.cm.RdBu) 但是,如果我的数据集在0左右不对称,我该怎么办?假设我想从蓝色(负值)到0(白色),再到红色(正值)。如果我的数据集从-8变为3,那么颜色栏的白色部分(应该是0)实际上是略微负的。有什么方法可以改变颜色栏吗?首先,有多种方法可以做到这一点 将的实例作为normkwarg传递 使用colorskwarg到contourf并
plt.contourf(x, y, z, label = 'blah', cm = matplotlib.cm.RdBu)
但是,如果我的数据集在0左右不对称,我该怎么办?假设我想从蓝色(负值)到0(白色),再到红色(正值)。如果我的数据集从-8变为3,那么颜色栏的白色部分(应该是0)实际上是略微负的。有什么方法可以改变颜色栏吗?首先,有多种方法可以做到这一点
norm
kwarg传递colors
kwarg到contourf
并手动指定颜色matplotlib.colors.from\u levels\u和\u colors
构建的离散颜色贴图imshow
,scatter
,等等)
第三个选项从特定颜色构造一个离散的颜色映射和规格化对象。它基本上与第二个选项相同,但它将a)使用等高线图以外的其他类型的图,b)避免手动指定等高线的数量
作为第一个选项的示例(我将在这里使用imshow
,因为它比tourtf
对随机数据更有意义,但是tourtf
除了插值
选项外,还有相同的用法):
作为第三个选项的示例(请注意,这将提供离散的colormap,而不是连续的colormap):
应添加到Matplotlib@Joe金顿,那真是太棒了!我正在为一个开源项目复制您的类定义,并将您的名字作为作者。希望你能接受。@user832-加油!然而,保罗·霍布森(Paul Hobson)为最近向mpl提出的一个拉取请求编写了一个更完整的通用版本:根据您需要的功能,您可能最好将其作为基础。@JoeKington谢谢!我会检查保罗的答案,但现在你的答案正是我所需要的!正如@JoeKington上面提到的,中点规格化不处理许多边缘情况。我需要一个解决方案,它使用一个包含所有零的起始数组,然后随着值随时间的变化而更新。我最终采用了不同的标准来处理这个案子。这一问题的强有力解决方案显然非常困难,以至于开发工作不再进行。这似乎有些奇怪,因为在使用带有正负数据的发散调色板时,将0设置为中心点是一个常见的用例。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import DivergingNorm
data = np.random.random((10,10))
data = 10 * (data - 0.8)
fig, ax = plt.subplots()
im = ax.imshow(data, norm=DivergingNorm(0), cmap=plt.cm.seismic, interpolation='none')
fig.colorbar(im)
plt.show()
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import from_levels_and_colors
data = np.random.random((10,10))
data = 10 * (data - 0.8)
num_levels = 20
vmin, vmax = data.min(), data.max()
midpoint = 0
levels = np.linspace(vmin, vmax, num_levels)
midp = np.mean(np.c_[levels[:-1], levels[1:]], axis=1)
vals = np.interp(midp, [vmin, midpoint, vmax], [0, 0.5, 1])
colors = plt.cm.seismic(vals)
cmap, norm = from_levels_and_colors(levels, colors)
fig, ax = plt.subplots()
im = ax.imshow(data, cmap=cmap, norm=norm, interpolation='none')
fig.colorbar(im)
plt.show()