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

