You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 11:34:55