求助:如何用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()
代码细节说明
- 日期处理:
parse_dates=['date']会把字符串格式的日期转换成datetime类型,index_col='date'把日期设为DataFrame的索引,这样绘图时x轴会自动用日期,显示更规范。 - 子图布局:
nrows=3对应你CSV里的3个人,sharex=True让所有子图共享x轴,不用每个子图都重复显示日期,视觉上更简洁。 - 遍历绘图:用
zip(axes, df.columns)把每个子图和对应的列配对,逐个绘制折线,同时设置每个子图的标题和y轴标签。 - 布局调整:
plt.tight_layout()会自动调整子图之间的间距,避免标题、标签互相遮挡。
如果后续你的CSV里人数变化(比如新增person4),只需要把nrows=3改成nrows=len(df.columns)就可以自动适配,不用手动修改行数。
内容的提问来源于stack exchange,提问作者Maria Wolfie
相关产品推荐
相关产品推荐

