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

如何用Pandas和Matplotlib绘制带正确时间轴的时序数据

解决方案:Matplotlib绘制时序数据时同时显示正确数据与时间轴

问题背景

使用Matplotlib绘制Pandas DataFrame中的时序数据,初始图表数据正确,但时间轴未按epochs对应小时数显示;修改后时间轴显示正确,但图表无数据。需要实现同时展示正确数据与对应小时时间轴的图表。

核心问题分析

  1. 之前直接设置plt.xlim([0, number_of_hours]),但数据仍使用原始整数索引,导致所有数据点的x值远小于设置的小时范围,被过滤后无法显示。
  2. 存在重复设置plt.xlabel的错误,且未正确设置y轴标签。
  3. 代码中有多余的无效语法行(单独的label=[...]行)。
  4. 未根据原始数据中的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 03:39:50