如何在matplotlib.pyplot中设置统一Y轴以展示数据细微差异
问题:Matplotlib绘图Y轴堆叠,数据点无法正常区分
我尝试在同一坐标轴上绘制多组数据点,展示数据间的细微差异,但绘图时Y轴出现堆叠,数据点近乎重复而非混合显示。只能使用numpy、math和matplotlib.pyplot库。
我能画出包含两条线的图表,但每次调用plot时Y轴都会被重置(出现堆叠)。已经尝试设置plt.ylim(0,1000)、将多组(x,y)放入同一条plot语句等方法,问题仍未解决。
- 错误图表表现:Y轴堆叠,数据点重叠,无法区分差异
- 正确图表表现:Y轴范围正常,数据点清晰区分
使用的导入语句
import numpy as np import matplotlib.pyplot as plt
当前出现问题的代码
getKey = [m for m in data] # 反转理想值列表 ideal2 = (data[getKey[0]]) ideal2r = [] for k in ideal2: ideal2r.insert(0,k) # 反转实际值列表 actual2 = (data[getKey[1]]) actual2r = [] for k in actual2: actual2r.insert(0,k) # 反转测量值列表 measured2 = (data[getKey[2]]) measured2r = [] for k in measured2: measured2r.insert(0,k) # 绘制理想值与实际值对比图(横轴为0-30的增量incs) plt.plot(incs,ideal2r,'b', label = 'ideal') plt.plot(incs,actual2r,'r', label = 'actual') # plt.axis('equal') plt.legend() plt.show() # 绘制实际值与测量值对比图(横轴为0-30的增量incs) plt.plot(incs,actual2r,'b', label = 'actual') plt.plot(incs,measured2r,'r', label = 'measured') # plt.axis('equal') plt.legend() plt.show()
对比:正常显示的函数代码
该函数中所有线条能在同一Y轴(0,1000)上正常显示:
k = np.linspace(0,9,10) x = [1000, 750, 563, 422, 316, 237, 178, 133, 100, 75] z = [927,870,567,271,132,47,92,79,99,123] # 函数剩余部分 r = 200 a = 0.75 x_est = [z[0]] p_est = [1] g_est = [0] x_hat = z[0] p = 1 # 不能为0 for i in range(len(k)-1): # 初始化 x_hat = a*x_hat p = a*p*a # 预测 g = p/(p+r) # 添加噪声预测 x_hat = x_hat + g*(z[i] - x_hat) p = (1-g)*p # 更新 p_est.append(p) x_est.append(x_hat) g_est.append(g) plt.plot(k,x,'b', label = 'true state') plt.plot(k,z,'r', label = 'observation') plt.plot(k, x_est, 'g', label = 'estimate') plt.legend() plt.show()
使用的数据:0-30增量对应的三组数值,范围在0-1000之间。
解决方案
1. 修复数据反转方式
你用insert(0, k)逐个插入元素反转列表,不仅效率低,还可能因操作失误导致数据长度或顺序异常。改用Python列表切片反转:
ideal2r = ideal2[::-1] actual2r = actual2[::-1] measured2r = measured2[::-1]
2. 正确设置Y轴范围
强制设置Y轴范围时,要放在所有plot调用之后,确保覆盖自动计算的轴范围:
plt.plot(incs,ideal2r,'b', label = 'ideal') plt.plot(incs,actual2r,'r', label = 'actual') plt.ylim(0, 1000) # 所有绘图完成后再设置 plt.legend() plt.show()
3. 检查数据长度匹配
确认incs的长度和反转后的ideal2r/actual2r等数据列表长度完全一致。如果长度不匹配,会导致绘图数据错位,看起来像Y轴堆叠。可以打印长度验证:
print(len(incs), len(ideal2r), len(actual2r))
4. 排查数据范围
如果以上方法无效,打印数据前几个元素确认范围是否符合预期:
print("ideal前5个值:", ideal2r[:5]) print("actual前5个值:", actual2r[:5])
内容的提问来源于stack exchange,提问作者AeroTerp
相关产品推荐
相关产品推荐

