Matplotlib 3.5.2中pcolormesh+TwoSlopeNorm如何保持刻度等距?
解决Matplotlib 3.5.2中TwoSlopeNorm色卡刻度不均问题
Matplotlib 3.5.x版本对TwoSlopeNorm配合colorbar的刻度生成逻辑做了调整:新版本会强制将vcenter放在色条的视觉中点,导致vmin到vcenter与vcenter到vmax的刻度间距不等,而3.4.3版本则保持vmin到vmax全程等距刻度。要在3.5.2中还原旧版效果,可通过以下两种方法实现:
方法一:手动生成等距刻度
直接计算并指定从vmin到vmax的等距刻度数组:
import matplotlib.pyplot as plt import numpy as np from matplotlib import colors fld = np.random.random((10,10)) - 0.2 norm = colors.TwoSlopeNorm(vmin=-0.2, vcenter=0, vmax=0.8) plt.pcolormesh(fld, norm=norm, cmap='bwr') # 生成vmin到vmax的等距刻度,示例设置6个刻度点 ticks = np.linspace(norm.vmin, norm.vmax, num=6) plt.colorbar(ticks=ticks) plt.show()
方法二:使用线性刻度定位器
利用LinearLocator自动生成等距刻度,无需手动计算刻度值:
import matplotlib.pyplot as plt import numpy as np from matplotlib import colors from matplotlib.ticker import LinearLocator fld = np.random.random((10,10)) - 0.2 norm = colors.TwoSlopeNorm(vmin=-0.2, vcenter=0, vmax=0.8) plt.pcolormesh(fld, norm=norm, cmap='bwr') # 指定生成6个等距刻度 plt.colorbar(ticks=LinearLocator(numticks=6)) plt.show()
两种方法都能保留TwoSlopeNorm以0为色卡中点的映射逻辑,同时让colorbar刻度在-0.2到0.8区间内保持等距分布,与3.4.3版本的显示效果一致。
内容的提问来源于stack exchange,提问作者Menno
相关产品推荐
相关产品推荐

