在plt.contourf中使用非线性级别时保持色彩图的线性颜色

时间:2017-08-24 12:07:34

标签: python matplotlib colormap color-mapping

在下面的示例中,我想手动将levels绘图的contourf设置为某个变量的分位数(以便增强视觉化)。

但是levels也会影响colormap颜色的缩放(请参阅红色如何扩展 - >视觉效果不受影响):如何保持线性?

换句话说,如何保持颜色条的颜色与顶部子图一样,但是对应于底部子图中的值?

import matplotlib.pyplot as plt
import numpy as np

xvec = np.linspace(-10.,10.,100)
x,y = np.meshgrid(xvec, xvec)
z = -(x**2 + y**2)**2

fig, (ax0, ax1) = plt.subplots(2)
p0 = ax0.contourf(x, y, z, 100)
fig.colorbar(p0, ax=ax0)
p1 = ax1.contourf(x, y, z, 100, levels=np.percentile(z, np.linspace(0,100,101)))
fig.colorbar(p1, ax=ax1)

plt.show()

enter image description here

我是否错过了一些简单的解决方案(我敢打赌),或者我应该尝试做一些matplotlib.colors.LinearSegmentedColormap操作......?

1 个答案:

答案 0 :(得分:2)

您可以使用matplotlib.colors.BoundaryNorm指定用于颜色映射的级别。

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

xvec = np.linspace(-10.,10.,100)
x,y = np.meshgrid(xvec, xvec)
z = -(x**2 + y**2)**2

fig, (ax0, ax1) = plt.subplots(2)
p0 = ax0.contourf(x, y, z, 100)
fig.colorbar(p0, ax=ax0)

levels = np.percentile(z, np.linspace(0,100,101))
norm = matplotlib.colors.BoundaryNorm(levels,256)
p1 = ax1.contourf(x, y, z, 100, levels=levels, norm=norm)
fig.colorbar(p1, ax=ax1)

plt.show()

enter image description here