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

求助:如何用Matplotlib从CSV文件创建多行堆叠子图?

实现Matplotlib堆叠子图展示CSV中多列数据

嘿,我懂你想要的是那种每个数据系列单独占一个垂直堆叠子图的效果,而不是把所有线条挤在同一张图里。咱们来一步步解决这个问题,先看看你现有代码里的小问题,再给出完整的实现方案。

先梳理下现有代码的问题

你的代码里有几个小疏漏:

  • df.plot(xlim=(0, 10) 少了闭合的右括号,会导致语法错误
  • 默认的df.plot()会把所有数值列都画在同一张图表里,这不是你想要的
  • 没有把date列设置为x轴,而且日期还是字符串格式,后续显示和处理都会有问题

完整解决方案代码

下面是实现堆叠子图的完整代码,我会逐行解释:

import pandas as pd
import matplotlib.pyplot as plt

# 读取CSV,同时把date列解析为日期类型并设为索引
df = pd.read_csv("test.csv", parse_dates=['date'], index_col='date')

# 创建3行1列的子图布局,共享x轴让图表更整洁,设置整体大小
fig, axes = plt.subplots(nrows=3, ncols=1, figsize=(8, 10), sharex=True)

# 遍历每个数据列和对应的子图,绘制折线图
for ax, person_col in zip(axes, df.columns):
    # 在当前子图绘制该人物的数据
    df[person_col].plot(ax=ax, linewidth=2)
    # 设置子图标题和y轴标签
    ax.set_title(f'{person_col}')
    ax.set_ylabel('数值')

# 自动调整子图间距,避免标题和标签重叠
plt.tight_layout()
# 共享的x轴标签统一设置(可选)
axes[-1].set_xlabel('日期')
plt.show()

代码细节说明

  1. 日期处理:parse_dates=['date']会把字符串格式的日期转换成datetime类型,index_col='date'把日期设为DataFrame的索引,这样绘图时x轴会自动用日期,显示更规范。
  2. 子图布局:nrows=3对应你CSV里的3个人,sharex=True让所有子图共享x轴,不用每个子图都重复显示日期,视觉上更简洁。
  3. 遍历绘图:用zip(axes, df.columns)把每个子图和对应的列配对,逐个绘制折线,同时设置每个子图的标题和y轴标签。
  4. 布局调整:plt.tight_layout()会自动调整子图之间的间距,避免标题、标签互相遮挡。

如果后续你的CSV里人数变化(比如新增person4),只需要把nrows=3改成nrows=len(df.columns)就可以自动适配,不用手动修改行数。

内容的提问来源于stack exchange,提问作者Maria Wolfie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:21:31