matplotlib 使用PeriodIndex绘制Pandas Dataframe

35g0bw71  于 2023-03-03  发布在  其他
关注(0)|答案(3)|浏览(144)

我在绘制包含PeriodIndexpandas Dataframe 时遇到问题。
我的数据存在差距,我希望实现以下目标:

  • 差距仍应是差距,不加插补;
  • 由于每个值在整个时间段内有效,因此该值应在整个时间段内显示为水平线。
  • 最好拥有:在周期边界处没有垂直线。

示例

yearly = pd.DataFrame({'avSpeed': [50, 40, 20, 16]}, index=pd.PeriodIndex(['2014', '2015', '2018', '2019'], freq='A'))

      avSpeed
2014       50
2015       40
2018       20
2019       16

我的代码到目前为止

  • 通过使用NaN填充间隙(通过以不变的频率重新采样)使 Dataframe 无间隙:
yearly2 = yearly.resample('A').mean()

        avSpeed
  2014     50.0
  2015     40.0
  2016      NaN
  2017      NaN
  2018     20.0
  2019     16.0
  • steps-post绘制:
plt.figure()
  yearly2['avSpeed'].plot(color='red', drawstyle='steps-post')

还缺少什么:

  • 主要问题:2019年的数值仅在年初显示。
  • 另外:存在垂直连接线(不需要)。
yvfmudvl

yvfmudvl1#

可以将hlinespandas.PeriodIndex属性start_timeend_time一起使用

ax = plt.subplot()
ax.hlines(yearly, yearly.index.start_time, yearly.index.end_time, 'r', label='avSpeed')
ax.legend()

8ftvxx2r

8ftvxx2r2#

由于这只是您遇到问题的最后一个期间,因此只需附加一个新期间,偏移量为1年并填充nan即可解决您的问题:

yearly2.loc[yearly2.index[-1] + pd.offsets.YearEnd(1), :] = np.nan

使用YearEnd指定pd.offset将保留您的PeriodIndex频率,当使用freq='A'重采样/创建PeriodIndex时,该频率为A-DEC。对于其他周期频率,当然应使用其他偏移。

whlutmcx

whlutmcx3#

不需要对数据进行上采样,甚至不需要使用NaN填充数据间隙。您可以将数据绘制为hlines,如下所示:

ax=plt.subplot()
ax.hlines(yearly['avSpeed'],  yearly.index.start_time, (yearly.index+1).start_time, 'r') #or: yearly.index.end_time
ax.legend()
plt.show()

非常感谢@piRSquared为我指明了正确的方向。
此答案作为CC BY-SA 4.0下OP ElRudi使用PeriodIndex绘制Pandas Dataframe 问题的edit发布。

相关问题