Matplotlib次X轴对数刻度数值反向问题:主X轴线性递增场景
解决Matplotlib次X轴(对数刻度)方向反向的问题
你的核心问题是高度递增时柱密度递减,但Matplotlib的secondary_xaxis默认按主轴正向映射刻度,导致次轴数值方向与物理意义相反。以下是两种可行的解决方法:
方法1:反转次X轴刻度方向
在创建次轴后直接调用invert_xaxis(),让次轴的刻度从左到右递减,匹配柱密度随高度升高而降低的物理规律:
fig = plt.figure(figsize=(8,6)) plt.rcParams['font.size']=14 ax1 = fig.add_subplot(111) alts = column_density_to_altitude(cds) ax1.plot(alts, f0_hplus_cd[0,:], c='navy', label='F$^0$(E=1 keV)') ax1.plot(alts, f0_hplus_cd[1,:], c='blue', label='F$^0$(E=2 keV)') ax1.plot(alts, f0_hplus_cd[2,:], c='skyblue', label='F$^0$(E=3 keV)') ax1.legend() ax1.set_title('Evolution of ENA Fraction vs. Altitude') ax1.set_ylabel('Neutral Percentange [%]') ax1.set_xlabel('Altitude [km]') # 创建次轴并设置转换函数 ax2 = ax1.secondary_xaxis(-0.2, functions=(calculate_column_density, column_density_to_altitude)) ax2.set_xscale('log') # 反转次轴刻度方向,匹配柱密度递减规律 ax2.invert_xaxis() ax2.set_xlabel('Column Density [cm$^{-2}$]') plt.tight_layout() plt.show()
方法2:修改转换函数的映射方向
如果不想反转轴,可以调整转换函数,让主轴到次轴的映射变为柱密度的倒数,但需同步修改逆转换函数,确保交互时坐标映射正确:
# 定义反向转换函数 def forward(a): n = calculate_column_density(a) # 返回倒数,让高度递增对应次轴数值递增(实际柱密度递减) return 1/n def inverse(n_inv): n = 1/n_inv return column_density_to_altitude(n) # 创建次轴时使用新的转换函数 ax2 = ax1.secondary_xaxis(-0.2, functions=(forward, inverse)) ax2.set_xscale('log') ax2.set_xlabel('1/Column Density [cm$^{2}$]') # 同步修改轴标签
优先推荐方法1,它直接保留柱密度的物理单位,无需修改刻度含义,更符合直观的物理展示逻辑。
内容的提问来源于stack exchange,提问作者Sarah Henderson
相关产品推荐
相关产品推荐

