如何让matplotlib创建以0为中心的颜色条?

2 投票
1 回答
794 浏览
提问于 2025-04-18 04:39

我正在绘制一些数据的Wigner分布图,在分布的极端部分,数值往往接近0。而且这些数值波动很大,导致我的测试图看起来像这样:

Wigner分布图

在蓝色“海洋”中的波浪幅度大约是1E-18,但因为它们围绕0波动,所以在颜色条上会穿过一条线。

我该如何制作一个contourf()图,使颜色以零为中心,而不是把零当作边界值呢?

1 个回答

1

我觉得你想要的是这样的:

class set_cbar_zero(Normalize):
  """
  set_cbar_zero(midpoint = float)       default: midpoint = 0.

  Normalizes and sets the center of any colormap to the desired valua which 
  is set using midpoint. 
  """
  def __init__(self, vmin = None, vmax = None, midpoint = 0., clip = False):
    self.midpoint = midpoint
    Normalize.__init__(self, vmin, vmax, clip)

  def __call__(self, value, clip = None):
    x, y = [self.vmin, self.midpoint, self.vmax], [0, 0.5, 1]
    return numpy.ma.masked_array(numpy.interp(value, x, y))

然后你可以对颜色条进行归一化,这样应该能解决你的问题,如果我理解得没错的话。

import numpy 
import matplotlib.pylab as plt

data = numpy.random.random((30, 95))

plt.figure()
plt.imshow(data, cmap = "hot", norm = set_cbar_zero())
plt.show()

撰写回答