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

如何为pandas plot.bar()绘制的时间序列图表添加垂直线

直接用日期给柱状图添加垂直线的简洁方法

这确实是个容易踩坑的小细节——当你使用df.data.plot.bar()绘制柱状图时,Matplotlib会把x轴处理成离散的类别索引(对应DataFrame索引的顺序位置:0、1、2...),而不是连续的日期时间轴,所以直接传入日期字符串给plt.axvline()自然不会生效。

不过完全不用依赖繁琐的ax.patches操作,有两种更简洁的方式可以直接通过日期定位添加垂直线:

方法1:利用索引位置定位

先通过DataFrame的索引找到目标日期对应的位置序号,再把这个序号传给axvline():

import pandas as pd
import matplotlib.pyplot as plt

# 构造你的DataFrame
df = pd.DataFrame(
    {'data': [14628.0, 1969.0, 50918.0]},
    index=pd.to_datetime(['2021-06-05', '2021-06-06', '2021-06-07'])
)

# 目标日期
target_date = pd.to_datetime('2021-06-06')
# 获取该日期在索引中的位置
x_position = df.index.get_loc(target_date)

# 绘制柱状图并添加垂直线
df.data.plot.bar()
plt.axvline(x=x_position, color='r', linestyle='--')
plt.show()

这种方法的核心是:柱状图的每个柱子对应x轴的整数位置(从0开始),get_loc()可以快速把日期映射到这个位置上,比操作柱子的坐标要直观得多。

方法2:显式指定x轴为日期(进阶)

如果你希望x轴保留日期的语义(比如后续要做更多时间相关的操作),可以手动匹配x轴刻度和日期的对应关系:

ax = df.data.plot.bar()
# 获取所有x轴刻度的位置和对应的日期标签
x_ticks = ax.get_xticks()
x_labels = [pd.to_datetime(label.get_text()) for label in ax.get_xticklabels()]
# 找到目标日期对应的刻度位置
target_idx = x_labels.index(pd.to_datetime('2021-06-06'))
plt.axvline(x=x_ticks[target_idx], color='g')
plt.show()

这种方式适合x轴标签经过特殊格式化的场景,但一般来说方法1已经足够解决你的问题。

为什么原来的方法无效?

再补个小解释:当你用df[col].plot()(默认折线图)时,Matplotlib会把日期索引解析成连续的时间轴(转换成timestamp数值),所以传入日期字符串可以被识别;但柱状图属于分类图,x轴是离散的类别,每个类别的位置是整数序号,自然无法直接映射日期字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 18:32:33