Matplotlib使用subplots绘制首个子图偏移与Pandas plot结果不一致问题
问题原因说明
偏移产生的核心原因
- 布局调整机制差异:pandas的
plot()方法内部默认会执行布局自动优化,确保所有绘图元素对齐。而手动调用plt.subplots()后没有主动触发布局调整,在sharex=True模式下,默认仅最底部的子图显示x轴刻度标签,上方3个子图的x轴刻度默认隐藏,节省出来的底部空间没有被自动重新分配,加上每个子图都单独添加了图例,进一步挤压了绘图区域,最终导致第一个子图和下方三个子图位置出现视觉偏移。 - 默认边距设置差异:matplotlib创建子图时,默认会给整幅图的顶部预留更多边距,第一个子图上方没有其他子图挤压,而下方子图之间的默认间距更小,叠加图例占用的空间后,第一个子图的偏移会更明显。
两种结果的选择标准
两种绘图结果本身都是正确的,不存在绝对的“标准答案”,根据使用场景选择即可:
- 如果需要将每列数据放在独立坐标轴上单独观察趋势,就用
plt.subplots()的方案,只要在plt.show()之前添加fig.tight_layout()即可解决偏移问题,调整后代码如下:
import matplotlib.pyplot as plt import pandas as pd data = pd.read_csv("data.csv", sep="\t") fig, axes = plt.subplots(4, 1, sharex=True) for i, c in enumerate(data.columns): axes[i].plot(data[c], label=f"{c}") axes[i].legend() fig.tight_layout() # 新增布局调整代码 plt.show()
- 如果需要将所有列放在同一坐标轴上直接对比数值差异,直接用
pd.DataFrame.plot()的默认方案即可。
内容的提问来源于stack exchange,提问作者Francesco Cariaggi
相关产品推荐
相关产品推荐

