如何基于数组长度生成时间轴并将Matplotlib图表1转换为图表2
问题与解决方案
1. 如何基于数组长度生成时间轴?
- 若数据采样间隔为1秒/样本,直接基于数组长度生成连续整数即可,可简化原代码的循环写法:
# 假设数据长度为1950,直接生成时间轴 x = list(range(1950)) # 用numpy实现更高效 import numpy as np x = np.arange(1950) - 若有实际采样频率(例如
fs=100Hz,即每秒采集100个样本),需生成对应真实时间轴:fs = 100 # 采样频率 data_length = 1950 # 生成从0到总时长的连续时间序列 x = np.linspace(0, data_length / fs, data_length)
2. 将图表1转换为图表2的实现方案
图表1为单坐标轴同时展示真实值与预测值曲线;图表2分为上下两个子图,上方仅展示真实值曲线,下方展示预测值与真实值的残差(差值)曲线。修改后的代码如下:
import matplotlib.pyplot as plt import numpy as np # 假设out(真实值)和predictions(预测值)为已加载的数据集 colors=['red','green','brown','teal','gray','black','maroon','orange','purple'] colors2=['green','red','orange','black','maroon','teal','blue','gray','brown'] data_length = 1950 x = np.arange(data_length) # 生成时间轴 for i in range(0,1): # 创建2行1列的子图布局,共享x轴 fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(15, 10), sharex=True) # 上方子图:绘制真实值曲线 ax1.plot(x, out[0:data_length,i], color=colors[i]) ax1.set_title('LSTM Regression (Training Data)') ax1.set_ylabel('Force/Fz (N)') ax1.legend(['Real value'], loc='upper right') # 下方子图:计算并绘制残差(预测值 - 真实值) residual = predictions[0:data_length,i] - out[0:data_length,i] ax2.plot(x, residual, color=colors2[i]) ax2.set_ylabel('Residual (Predicted - Real)') ax2.set_xlabel('Time/s') ax2.legend(['Residual'], loc='upper right') # 自动调整子图间距,避免标签重叠 plt.tight_layout() # 修正原代码的保存路径错误,生成合法文件名 plt.savefig(f'Regression Result_{i}.png') plt.show()
关键修改说明:
- 用
plt.subplots(2, 1)创建上下布局的子图,sharex=True让两图共享x轴,提升可读性 - 拆分原单图内容:上方子图仅展示真实值,下方子图聚焦残差分析
- 调整画布尺寸为
(15,10)适配上下布局,plt.tight_layout()自动优化子图间距 - 修复原代码中
plt.savefig的索引错误,用格式化字符串生成合法文件名
内容的提问来源于stack exchange,提问作者lead step
相关产品推荐
相关产品推荐

