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

带PeriodIndex的Pandas DataFrame绘图问题及需求求助

解决带有PeriodIndex的Pandas DataFrame绘图问题(保留间隙、水平线覆盖时段、无垂直线)

我明白你遇到的问题了——用steps-post虽然能近似实现时段覆盖,但最后一个时段的显示不对,还会出现多余的垂直线。咱们换个思路,直接基于每个Period的时间区间来绘制水平线,完美满足你的三个需求:

核心思路

每个Period都自带明确的时间区间(比如年度Period是从当年1月1日到下一年1月1日),我们直接针对这个区间绘制水平线,就能让每个值完整覆盖对应时段,同时自然保留数据间隙,也不会产生多余的垂直线。

完整实现代码

import pandas as pd
import matplotlib.pyplot as plt

# 你的原始数据
yearly = pd.DataFrame({'avSpeed': [50, 40, 20, 16]}, index=pd.PeriodIndex(['2014', '2015', '2018', '2019'], freq='A'))

plt.figure(figsize=(10, 6))

# 遍历每一行数据,绘制对应时段的水平线
for idx, row in yearly.iterrows():
    # 获取当前Period的起始和结束时间(自动转换为datetime格式)
    start_time = idx.start_time
    end_time = idx.end_time
    # 绘制水平线:x轴是时段的起止时间,y轴是对应的值(重复两次保证是水平线段)
    plt.plot([start_time, end_time], [row['avSpeed'], row['avSpeed']], color='red', linewidth=2)

# 自定义x轴刻度,让年份显示更清晰
plt.xticks(
    pd.date_range(start='2014-01-01', end='2020-01-01', freq='A'),
    ['2014', '2015', '2016', '2017', '2018', '2019']
)
plt.ylabel('Average Speed')
plt.title('Yearly Average Speed (Gaps Preserved)')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()

效果说明

  • 每个数值会完整覆盖对应的整个时段(比如2014年的50会从2014年初画到2015年初);
  • 2016、2017年的间隙会被自然保留,不会有任何填充或线条;
  • 完全不存在时段边界的垂直线;
  • 最后一个时段(2019年)的数值也会完整覆盖全年,不会只显示在年初。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:29:35