如何在同一张画布中为多个pandas dataframe分别绘制子图
多pandas DataFrame子图绘制解决方案
问题根因
原代码没有指定df.plot()的绘制目标轴对象,pandas绘图时会默认创建独立的新画布,导致matplotlib预留的子图位置为空,和预期效果不符。
修正后可运行代码
写法1(和原代码逻辑对齐)
import pandas as pd import matplotlib.pyplot as plt plt.figure(figsize=(20, 20)) for i, name in enumerate(names): df = pd.read_excel(myPath + name) df['Datetime'] = pd.to_datetime(df['Datetime']) df = df.set_index('Datetime') # 获取当前子图的Axes对象 ax = plt.subplot(4, 1, i+1) # 传递Axes给pandas的plot方法,指定在该子图上绘制 df.plot(ax=ax) # 可选:为每个子图设置标题区分数据源 ax.set_title(f'数据源:{name}') # 自动调整子图间距,避免标题、标签重叠 plt.tight_layout() plt.show()
写法2(更规范的Matplotlib接口写法)
提前一次性创建所有子图对象,逻辑更清晰:
import pandas as pd import matplotlib.pyplot as plt # 一次性创建4行1列的子图网格 fig, axes = plt.subplots(nrows=4, ncols=1, figsize=(20, 20)) for i, name in enumerate(names): df = pd.read_excel(myPath + name) df['Datetime'] = pd.to_datetime(df['Datetime']) df = df.set_index('Datetime') # 指定对应位置的子图作为绘制载体 df.plot(ax=axes[i]) axes[i].set_title(f'数据源:{name}') plt.tight_layout() plt.show()
可选优化项
- 统一子图样式:在
df.plot()中传入样式参数,比如df.plot(ax=ax, grid=True, color='#2E86AB')开启网格、指定折线颜色 - 统一轴标签:循环中添加
ax.set_xlabel('日期')、ax.set_ylabel('数值')定义公共轴标签 - 共享X轴:如果4个图的时间范围一致,可以在创建子图时添加
sharex=True参数,避免重复显示X轴刻度,节省空间:fig, axes = plt.subplots(nrows=4, ncols=1, figsize=(20,20), sharex=True)
内容的提问来源于stack exchange,提问作者Lleims
相关产品推荐
相关产品推荐

