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

设置Matplotlib左xlim为1时触发‘Axis limits cannot be NaN or Inf’错误求助

解决Matplotlib次级轴设置xlim时的ValueError: Axis limits cannot be NaN or Inf问题

问题原因

你的代码里,主x轴设置了ax.set_xlim(left=1, right=360),但主轴刻度用了np.linspace(0,360,10)——这个刻度数组包含0。次级轴的转换函数invert会把0转为inf,Matplotlib计算次级轴范围时,这个无穷大值直接触发了ValueError。

而只设置ax.set_xlim(right=360)时,主x轴左极限默认是数据最小值1,此时0这个刻度超出了显示范围,Matplotlib会跳过对它的转换计算,因此不会报错。

解决方案

调整主轴的刻度,确保所有刻度值都在xlim范围内,避免出现0这类会触发转换出inf的值:

修改后的完整代码:

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()
ax.plot(range(1, 360, 5), range(1, 360, 5))
ax.set_xlabel('frequency [Hz]')

def invert(x):
    # 1/x with special treatment of x == 0
    x = np.array(x).astype(float)
    near_zero = np.isclose(x, 0)
    x[near_zero] = np.inf
    x[~near_zero] = 1 / x[~near_zero]
    return x

ax.set_xlim(left=1, right=360)
# 主刻度从1开始,和xlim范围匹配
ax.set_xticks(np.linspace(1, 360, 10))
secax = ax.secondary_xaxis('top', functions=(invert, invert))
secax.set_xticks(1/np.linspace(1, 360, 5))
secax.set_xlabel('Period [s]')
plt.show()

补充说明

如果需要保留主轴刻度的分布逻辑,也可以通过过滤掉小于1的刻度值来实现:

ticks = np.linspace(0, 360, 10)
ax.set_xticks(ticks[ticks >= 1])

这样既保持了原有的刻度间隔,又不会传入0给转换函数。

内容的提问来源于stack exchange,提问作者Jordi Blanco Pozo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 15:15:43