Matplotlib 确保0在RdBu颜色栏中变为白色

Matplotlib 确保0在RdBu颜色栏中变为白色,matplotlib,colormap,Matplotlib,Colormap,我使用以下代码片段创建了一个热图: 将numpy导入为np 将matplotlib.pyplot作为plt导入 d=np.随机.正态(.4,2,(10,10)) plt.imshow(d,cmap=plt.cm.RdBu) plt.colorbar() plt.show() 结果如下图所示: 现在,由于数据的中点不是0,因此colormap值为0的单元格不是白色,而是略带红色 如何强制彩色贴图,使max=blue、min=red和0=white?前一篇so帖子()希望解决更复杂的情况,但其中

我使用以下代码片段创建了一个热图:

将numpy导入为np
将matplotlib.pyplot作为plt导入
d=np.随机.正态(.4,2,(10,10))
plt.imshow(d,cmap=plt.cm.RdBu)
plt.colorbar()
plt.show()
结果如下图所示:

现在,由于数据的中点不是0,因此colormap值为0的单元格不是白色,而是略带红色

如何强制彩色贴图,使max=blue、min=red和0=white?

前一篇so帖子()希望解决更复杂的情况,但其中一个答案谈到了中的MidpointNormalize子类。这样,解决方案就变成:

将matplotlib导入为mpl
将numpy作为np导入
将matplotlib.pyplot作为plt导入
类中点规格化(mpl.colors.Normalize):
##从mpl文档中初始化:
# https://matplotlib.org/users/colormapnorms.html
定义初始值(self,vmin=None,vmax=None,middpoint=None,clip=False):
self.midpoint=中点
super().\uuuu init\uuuu(vmin,vmax,clip)
定义调用(self、value、clip=None):
#我忽略了遮罩值和所有类型的边缘情况,以创建一个
#简单的例子。。。
x、 y=[self.vmin,self.middpoint,self.vmax],[0,0.5,1]
返回np.ma.masked_数组(np.interp(值,x,y))
d=np.随机.正态(.4,2,(10,10))
plt.imshow(d,cmap=plt.cm.RdBu,norm=middpointnormalize(middpoint=0))
plt.colorbar()
plt.show()
Joe Kington编写了这个子类,Rutger Kassies指出了答案

使用一个

注意:从matplotlib 3.2开始
diversingnorm
重命名为
TwoSlopeNorm

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

d = np.random.normal(.4,2,(10,10))

norm = mcolors.DivergingNorm(vmin=d.min(), vmax = d.max(), vcenter=0)
plt.imshow(d, cmap=plt.cm.RdBu, norm=norm)

plt.colorbar()
plt.show()

此外,您还可以手动设置coloraxis的限制