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

Matplotlib子图绘制水平线:当前方法能否实现全子图添加?

解决pandas子图仅最后一个显示axhline的问题

嘿,这个问题我之前也踩过坑!当然可以给所有2×2布局的子图都添加上水平线啦~

为什么之前只有最后一个子图显示水平线?

你用plt.axhline的时候,它默认只会把线画在当前处于活跃状态的子图上。当你用pandas的plot(subplots=True, layout=(2,2))生成子图后,程序最后聚焦的是右下角的那个子图,所以只有它被加上了线。

两种可行的解决方法

方法1:利用pandas plot返回的Axes对象

pandas的plot方法在设置subplots=True时,会返回一个包含所有子图Axes对象的数组。我们只需要遍历这个数组,给每个Axes单独调用axhline就行:

import pandas as pd
import matplotlib.pyplot as plt

# 生成子图并获取所有Axes对象
axes = ctr_df.plot(kind='bar', subplots=True, layout=(2,2), figsize=(10,8))

# 遍历每个子图,添加水平线(y值换成你需要的基准值)
for ax in axes.flatten():  # flatten把2×2的二维数组转成一维,方便遍历
    ax.axhline(y=0.5, color='red', linestyle='--', label='基准线')
    ax.legend()  # 可选:显示图例

plt.tight_layout()  # 自动调整子图间距,避免标题/标签重叠
plt.show()

方法2:手动创建子图布局,逐个绘制控制

如果你想更灵活地控制每个子图的细节(比如单独设置标题、坐标轴标签),可以先手动创建2×2的子图布局,再遍历数据列逐个绘制并添加水平线:

import pandas as pd
import matplotlib.pyplot as plt

# 手动创建2×2的子图布局
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10,8))
axes = axes.flatten()  # 转成一维数组方便遍历

# 遍历每一列数据和对应的子图
for col, ax in zip(ctr_df.columns, axes):
    # 绘制该列的周度柱状图
    ctr_df[col].plot(kind='bar', ax=ax)
    # 添加水平线
    ax.axhline(y=0.5, color='green', linestyle='-', linewidth=1.5)
    # 给子图添加标题(可选)
    ax.set_title(f'周度{col}趋势')
    # 设置x轴标签(可选)
    ax.set_xlabel('周数')

plt.tight_layout()
plt.show()

核心思路总结

不管用哪种方法,核心都是针对每个子图的Axes对象调用axhline方法,而不是直接用全局的plt.axhline——后者只会作用在当前活跃的那个子图上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:38:49