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

Matplotlib添加周期次坐标轴时出现除以零错误的问题咨询

Matplotlib添加周期次坐标轴时出现除以零错误的问题咨询

问题重现

我运行以下Python代码时,图表能正常生成,但控制台会抛出**除以零(Division by zero)**的错误。我的x轴数据和设置的显示范围都大于0,实在搞不懂为什么会触发这个错误:

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(10, 10))
freq = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 1.8, 2.0]
amp = [0.0, 0.0, 0.0, 0.0, 0.0, 0.012, 0.031, 0.074, 0.082, 0.084, 0.080, 0.078, 0.072, 0.059, 0.039, 0.019, 0.010]

ax.semilogx(freq, amp, marker='s', color='purple')
plt.xlim(0.1, 10)
plt.xlabel('Frequency (Hz)')
plt.ylabel('Crest Loss (ft)')
ax.set(title='Fundamental Frequency')
ax.grid()
ax.grid(which="minor", color="0.9")

def forward(x):
    return 1 / x
def inverse(x):
    return 1 / x

secax = ax.secondary_xaxis('top', functions=(forward, inverse))
secax.set_xlabel('Period (s)')

plt.show()

错误原因分析

虽然你的主x轴数据和显示范围(0.1-10)都大于0,但错误来自于次坐标轴的自动刻度计算逻辑:
Matplotlib在生成顶部次坐标轴的刻度时,会尝试扩展刻度范围以匹配默认的坐标轴显示规则,可能会尝试包含0这个边界值。此时你的inverse函数(return 1/x)在传入x=0时就会触发除以零错误。

简单来说:主x轴0.1-10对应次坐标轴的范围是0.1-10(因为1/10=0.1,1/0.1=10),但Matplotlib的自动刻度生成器可能会越界尝试计算x=0的情况,进而触发错误。

解决办法

你可以通过两种方式解决这个问题:

方法1:手动设置次坐标轴范围

直接限制次坐标轴的显示范围,避免Matplotlib尝试计算x=0的刻度:

secax = ax.secondary_xaxis('top', functions=(forward, inverse))
secax.set_xlabel('Period (s)')
# 手动设置次坐标轴的范围,和主x轴对应的次轴范围一致
secax.set_xlim(0.1, 10)

方法2:给转换函数添加安全判断

在forward和inverse函数中加入非零判断,避免除以零的情况:

def forward(x):
    # 当x为0时返回极大值,跳过错误计算
    return 1 / x if x != 0 else float('inf')
def inverse(x):
    return 1 / x if x != 0 else float('inf')

效果验证

两种方法都能让图表正常显示的同时消除除以零错误,其中方法1更贴合你的数据逻辑,能让次坐标轴的刻度更精准匹配主坐标轴的范围。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 08:37:59