我正在绘制一些数据的 Wigner 分布,在分布的极端部分,该值往往接近 0。它也往往会振荡很多,使我的测试图如下所示:
蓝色“海”中的波浪的振幅约为 1E-18,但由于它们在 0 附近振荡,它们与颜色条中的一条线相交。
如何制作一个以零为中心的颜色而不是以零作为边界值的 contourf()图?
我正在绘制一些数据的 Wigner 分布,在分布的极端部分,该值往往接近 0。它也往往会振荡很多,使我的测试图如下所示:
蓝色“海”中的波浪的振幅约为 1E-18,但由于它们在 0 附近振荡,它们与颜色条中的一条线相交。
如何制作一个以零为中心的颜色而不是以零作为边界值的 contourf()图?
我想你想要这样的东西:
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()