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

如何在同一张画布中为多个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 00:45:05