如何为时间序列DataFrame按天绘制3列布局的多子图?
解决方案
前置准备
先确保DataFrame的索引为datetime类型,若未转换先执行:
import pandas as pd import matplotlib.pyplot as plt # 转换索引为datetime类型 df.index = pd.to_datetime(df.index)
1. 一次性绘制所有日期的子图
利用Pandas原生的groupby按天分组特性,结合Matplotlib生成固定3列、行数自动适配的子图布局:
# 按天对数据分组 daily_data = df.groupby(df.index.date) total_days = len(daily_data) cols = 3 # 自动计算行数,向上取整适配总天数 rows = (total_days + cols - 1) // cols # 创建画布和子图数组 fig, axes = plt.subplots(nrows=rows, ncols=cols, figsize=(15, 4*rows), tight_layout=True) # 拍平子图数组,方便批量遍历 axes = axes.flatten() # 遍历分组绘制对应子图 for ax, (date, data) in zip(axes, daily_data): data.plot(y='Temp', ax=ax, title=str(date), legend=False) # 可选优化:x轴仅显示时间,去掉重复的日期信息 ax.xaxis.set_major_formatter(plt.matplotlib.dates.DateFormatter('%H:%M')) # 隐藏总天数不是3的倍数时多出的空子图 for i in range(total_days, len(axes)): axes[i].axis('off') plt.show()
2. 绘制指定N天范围的子图
只需先按时间范围筛选原DataFrame,后续绘图逻辑和上述完全一致即可:
# 示例:筛选2019年1月1日到2019年1月10日共10天的数据 start_date = '2019-01-01' end_date = '2019-01-10' filtered_df = df.loc[start_date:end_date] # 后续对filtered_df执行和上文完全相同的分组、绘图逻辑即可 daily_data = filtered_df.groupby(filtered_df.index.date) # 剩余代码和上文完全一致
内容的提问来源于stack exchange,提问作者Lleims
相关产品推荐
相关产品推荐

