Python中如何对colorbar进行归一化并设置指数形式刻度?
解决方案
你之前使用np.linspace生成的是均匀间隔的刻度,无法实现指数形式的刻度效果,可参考以下两种方案调整:
方案1:保留均匀数值间隔,仅修改刻度显示为指数格式
仅需在创建colorbar的代码后添加刻度格式化配置即可,修改后代码如下:import xarray as xr import numpy as np import matplotlib.pyplot as plt from matplotlib.ticker import ScalarFormatter ds = xr.open_dataset('PL_Era_Tkt.nc') wp = ds.w.mean(dim=['longitude','latitude']).plot.contourf(x='time',cmap='RdBu',add_colorbar=False,extend='both') wpcb = plt.colorbar(wp) # 新增指数格式配置 wpcb.formatter = ScalarFormatter(useMathText=True) wpcb.formatter.set_powerlimits((0, 0)) # 强制所有数值使用科学计数法显示 wpcb.update_ticks() wpcb.set_label(label='Pa.s${^{-1}}$',size=13) plt.gca().invert_yaxis() plt.title('Vertical Velocity',size=15) plt.show()方案2:使用非均匀的指数间隔刻度(和目标图效果完全匹配)
需要先自定义指数间隔的色阶,再手动设置colorbar的刻度值,修改后代码如下:import xarray as xr import numpy as np import matplotlib.pyplot as plt ds = xr.open_dataset('PL_Era_Tkt.nc') # 自定义正负对称的指数间隔色阶,可根据需要调整对数区间和分段数 neg_levels = -np.logspace(-2, 0, 20)[::-1] pos_levels = np.logspace(-2, 0, 20) levels = np.concatenate([neg_levels, pos_levels]) wp = ds.w.mean(dim=['longitude','latitude']).plot.contourf(x='time',cmap='RdBu',levels=levels,add_colorbar=False,extend='both') wpcb = plt.colorbar(wp) # 手动设置目标刻度值 wpcb.set_ticks([-1, -0.1, -0.01, 0, 0.01, 0.1, 1]) wpcb.set_label(label='Pa.s${^{-1}}$',size=13) plt.gca().invert_yaxis() plt.title('Vertical Velocity',size=15) plt.show()
内容的提问来源于stack exchange,提问作者Wind Circulation
相关产品推荐
相关产品推荐

