如何用Pandas和Matplotlib绘制带正确时间轴的时序数据
解决方案:Matplotlib绘制时序数据时同时显示正确数据与时间轴
问题背景
使用Matplotlib绘制Pandas DataFrame中的时序数据,初始图表数据正确,但时间轴未按epochs对应小时数显示;修改后时间轴显示正确,但图表无数据。需要实现同时展示正确数据与对应小时时间轴的图表。
核心问题分析
- 之前直接设置
plt.xlim([0, number_of_hours]),但数据仍使用原始整数索引,导致所有数据点的x值远小于设置的小时范围,被过滤后无法显示。 - 存在重复设置
plt.xlabel的错误,且未正确设置y轴标签。 - 代码中有多余的无效语法行(单独的
label=[...]行)。 - 未根据原始数据中的
Episodes和Steps计算实际小时数作为索引,导致时间轴与数据不匹配。
修改后的完整代码
import pandas as pd import matplotlib.pyplot as plt # 假设NameTime1、episodesDisplay1、episodesDisplay2已定义 headers3 = ['Zero', 'Episodes', 'Steps','Generator One', 'Generator Two', 'Load', 'Renewable','Battery Power', 'Battery Soc'] NameTime2 = NameTime1 Name3 = 'Grid-' + NameTime2 +'-Power-balance-lower' + '.csv' columns8 = ['Episodes', 'Load', 'Generator One', 'Generator Two','Renewable', 'Battery Power', 'Battery Soc'] df = pd.read_csv(Name3, names=headers3, usecols=columns8) episodesDisplay11 = episodesDisplay1 episodesDisplay21 = episodesDisplay2 # 筛选指定区间的Episodes数据 df = df.loc[(df["Episodes"] >= episodesDisplay11) & (df["Episodes"] < episodesDisplay21)] # 计算每条数据对应的小时数:起始Episode为0小时,每个Episode对应6小时,Steps转换为小时(Steps单位为分钟) df['Time_Hours'] = (df['Episodes'] - episodesDisplay11) * 6 + df['Steps'] / 60 # 处理电池充放电列 df['Battery_Discharging'] = df['Battery Power'].clip(lower=0) df['Battery_Charging'] = df['Battery Power'].clip(upper=0) # 设置时间列为索引 df = df.set_index('Time_Hours') # 初始化绘图轴 ax = plt.gca() # 绘制各曲线 df.plot(y='Battery Soc', ax=ax, label='Battery Soc', color='green', linestyle='dashed') df.plot(y='Load', ax=ax, label='Load', color='black', linewidth=3) df.plot.area(y=['Renewable', 'Generator One', 'Generator Two', 'Battery_Discharging', 'Battery_Charging'], stacked=True, alpha=0.7, ax=ax) # 设置图表属性 plt.title('Power Balance Lower Level', fontsize=16) plt.xlabel("Time [hours]", fontsize=14) plt.ylabel("Power [p.u.]", fontsize=14) plt.legend(fontsize=14) # 保存并显示图表 plt.savefig('Power_Balance-Lower.jpg') plt.show()
关键修改点说明
- 生成正确时间索引:通过
(df['Episodes'] - episodesDisplay11)*6 + df['Steps']/60计算每条数据对应的实际小时数,确保时间轴与数据一一对应。 - 设置时间列为索引:将计算出的
Time_Hours设为DataFrame的索引,绘图时自动使用该列作为x轴,无需额外调整x轴范围。 - 修正标签错误:将重复的
plt.xlabel改为plt.ylabel,正确标注功率单位。 - 移除无效代码:删除语法错误的单独
label=[...]行,简化绘图逻辑。 - 优化数据处理:去掉不必要的
df['index']列,直接使用计算出的时间列作为索引,避免索引混乱。
内容的提问来源于stack exchange,提问作者K. Rincon
相关产品推荐
相关产品推荐

