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

Matplotlib设置xlim/ylim坐标轴范围后绘图结果异常求解

问题根因

你的代码有三个核心错误,直接导致绘图结果不符合预期:

  • 错误将x轴数值转为字符串:你用format(e, 'f')把所有浮点型x坐标转成了字符串传入matplotlib,字符串会被识别为分类变量,不会按数值大小排序,对数刻度完全无法正常计算坐标位置。
  • 坐标轴配置顺序错误:你先调用xlim()/ylim()设置范围,之后才切换对数刻度,切换刻度类型时matplotlib会自动重置坐标轴范围,之前设置的范围直接失效。
  • 对数轴不支持非正数值:对数刻度无法处理小于等于0的数值,你传入的y1_l1全是负数、x1_l1第一个值是0,这些无效点会被直接过滤,曲线自然显示异常。
修正方案
  • 删掉两段把x值转字符串的循环,直接传入原始浮点类型的x数组,不需要额外做格式化转字符串操作。
  • 调整绘图代码执行顺序:先配置对数刻度,再设置坐标轴范围,保证范围设置在对数轴下生效。
  • 修正数据取值:如果要保留对数坐标轴,要确保所有x、y值都大于0;如果蓝线数据确实包含0或负值,就不能使用对数轴,需要切换为线性刻度。

修正后的可运行代码如下:

import matplotlib.pyplot as __plt


def plot(x, y, spec_x, spec_y):
    if None in (x, y, spec_x, spec_y) or '' in (x, y, spec_x, spec_y):
        raise ValueError
    # 先切换对数刻度
    __plt.xscale("log")
    __plt.yscale("log")
    # 再设置坐标轴范围
    __plt.xlim(min(spec_x), max(spec_x))
    __plt.ylim(min(spec_y), max(spec_y))
    __plt.plot(x, y, color='blue')
    __plt.plot(spec_x, spec_y, color='red', linestyle='dashed')
    __plt.xlabel('Frequencies (Hz)', fontsize=18)
    __plt.ylabel('Y Label', fontsize=16)
    __plt.grid(which='major', color='#DDDDDD', linewidth=0.8)
    __plt.grid(which='minor', color='#EEEEEE', linestyle=':', linewidth=0.5)
    __plt.savefig('test_graph.png', dpi=1000)
    __plt.clf()
    __plt.close()


if __name__ == "__main__":
    x1_l1 = [0.0, 1e-07, 1.20226443461741e-07, 1.31825673855641e-07, 1.44543977074593e-07, 1.58489319246111e-07,
             1.73780082874938e-07, 1.90546071796325e-07, 2.08929613085404e-07, 2.29086765276777e-07,
             2.51188643150958e-07, 2.75422870333817e-07, 3.01995172040202e-07, 3.31131121482591e-07,
             3.63078054770101e-07]

    y1_l1 = [-0.887961849042741, -0.887961849042741, -0.887961849042949, -0.887961849043086, -0.887961849043252,
             -0.887961849043453, -0.887961849043695, -0.887961849043987, -0.88796184904434, -0.887961849044765,
             -0.887961849045278, -0.887961849045896, -0.887961849046641, -0.887961849047538, -0.887961849048619]

    x1_l2 = [0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18,
             0.19, 0.2, 0.21, 0.22, 0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.3, 10.0]

    y1_l2 = [0.638219, 0.321497, 0.216958, 0.165437, 0.135094, 0.115313, 0.101539, 0.0914968, 0.0839203, 0.078051,
             0.073407, 0.0696679, 0.066613, 0.0640855, 0.0619714, 0.0601859, 0.0586651, 0.0573596, 0.0562311, 0.0552495,
             0.0543905, 0.0536349, 0.052967, 0.0523738, 0.0518448, 0.0513711, 0.0509454, 0.0505615, 0.0502142, 0.049899, 1.908654]

    # 注意:当前样例里x1_l1含0、y1_l1全为负值,若要保留对数轴需先修正这部分数据为正值,否则蓝线无法正常显示
    plot(x1_l1, y1_l1, x1_l2, y1_l2)

内容的提问来源于stack exchange,提问作者user18994682

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:27:25