带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
相关产品推荐
相关产品推荐

