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
首先,有不止一种方法可以做到这一点.
DivergingNorm
kwarg norm
并手动指定颜色colors
类并将实例作为contourf
kwarg传递.matplotlib.colors.from_levels_and_colors
.构造的离散色图.最简单的方法是传递特定的颜色imshow
.但是,如果您没有手动设置轮廓的数量,这可能会很不方便.
最灵活的方法是第二种选择:使用scatter
kwarg指定自定义规范化.对于你想要的东西,你需要子类化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)