设置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
相关产品推荐
相关产品推荐

