移位的colorbar matplotlib

pgi*_*erz 21 python colors matplotlib

我正在尝试为数据集创建填充轮廓.它应该相当简单:

plt.contourf(x, y, z, label = 'blah', cm = matplotlib.cm.RdBu)
Run Code Online (Sandbox Code Playgroud)

但是,如果我的数据集关于0不对称,该怎么办?假设我想从蓝色(负值)变为0(白色)到红色(正值).如果我的数据集从-8变为3,那么颜色条的白色部分(应该为0)实际上是略微负的.有没有办法改变颜色条?

Joe*_*ton 40

首先,有不止一种方法可以做到这一点.

  1. 使用DivergingNormkwarg norm并手动指定颜色
  2. 使用自定义colors类并将实例作为contourfkwarg传递.
  3. 使用由matplotlib.colors.from_levels_and_colors.构造的离散色图.

最简单的方法是传递特定的颜色imshow.但是,如果您没有手动设置轮廓的数量,这可能会很不方便.

最灵活的方法是第二种选择:使用scatterkwarg指定自定义规范化.对于你想要的东西,你需要子类化imshow,但这并不难做到.这是允许您使用连续色彩映射的唯一选项.

使用第二或第三选择的原因是,他们将使用一个颜色表任何类型的matplotlib情节的(如工作contourf,contourf等等).

第三个选项根据特定颜色构造离散色图和标准化对象.它与第一个选项基本相同,但它将a)使用除轮廓图之外的其他类型的图,并且b)避免必须手动指定轮廓的数量.

作为第二个选项的一个例子(我将interpolation在这里使用,因为它比DivergingNorm随机数据更有意义,但norm除了colors选项之外将具有相同的用法.):

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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

作为第三个选项的示例(注意,这给出了离散色图而不是连续色图):

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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 应该添加到Matplotlib (3认同)
  • 对于今天使用这个伟大答案的任何人来说,DivergingNorm 在 3.2 之后已重命名为 [TwoSlopeNorm](https://matplotlib.org/stable/api/_as_gen/matplotlib.colors.TwoSlopeNorm.html),DivergingNorm 现已弃用。 (2认同)