如何为绘制的数据框设置时间过滤器 - Matplotlib
Posted
技术标签:
【中文标题】如何为绘制的数据框设置时间过滤器 - Matplotlib【英文标题】:How to set time filter for plotted dataframe - Matplotlib 【发布时间】:2020-11-23 00:32:59 【问题描述】:我使用Matplotlib 3.3.0
绘制了一个数据框。
数据框的index
是一个datetime
对象,格式如下:
2018-05-29 08:09:00
(即year-month-day hour:minute:second
)
如何缩放到每小时或每日或每周或每月时间片?我想要一些QPushButton
以使用户能够缩放或平移到一天或一周或一个月或一个小时长度的时间片如图所示。
我将数据框绘制如下:
self.canvas.axes.plot(self.df.index, self.df.loc[:, self.comboBox.currentText()], linestyle="None", marker='.')
self.label = self.canvas.axes.set_xlabel('Time', fontsize=9)
self.label = self.canvas.axes.set_ylabel('Temperature - k [°C]', fontsize=9)
self.canvas.axes.legend('Temperature - k [°C]', bbox_to_anchor=(0., 1.02, 1., .102), loc='upper center', ncol=8, mode=None, borderaxespad=0.)
第二个问题是图例没有完整显示。仅显示其第一个字符。如何解决?
更新: 我尝试将基于时间元素的数据帧绘制为 X 轴,例如:
self.canvas.axes.plot(self.new_df.index.hour, self.new_df.loc[:, self.comboBox.currentText()])
但是,由于 hour
s 的值每天都在重复,并且在整个数据帧中重复,所以绘图没有正确绘制,如下图所示:
【问题讨论】:
@TrentonMcKinney 感谢传奇成功,太棒了。至于时间过滤器,我尝试将df.index.month
或 df.index.hour
作为 X 轴数据传递给 plot
函数,但是,由于时间值(例如一天中的小时数)一遍又一遍地重复,那么绘图未正确绘制。
@TrentonMcKinney:问题已更新。任何想法表示赞赏。
@TrentonMcKinney 我从here 获得了画布的想法。它只是使用 matplotlib 在画布中绘制数据。问题在于将多个元素作为列表传递给绘图函数的 X 轴,例如:self.canvas.axes.plot( (self.df.index.hour, self.df.index.minute), self.df.loc[:, self.comboBox.currentText()])
。它会抛出此错误:ValueError: x and y must have same first dimension, but have shapes (2, 7523) and (7523,)
@TrentonMcKinney:我相信这是一个matplotlib
的问题,与 PyQt5 无关。提供的链接使用“sqlite3”库中的一些内置方法来应用时间间隔,仅用于从数据库中选择我无法转换为 pandas 的数据。顺便说一句,谢谢。
我对您想要实现的目标感到困惑。您最初提到要缩放(我将其读作 silce/filter 日期列并可能重新采样)。在您的更新中,您似乎尝试重新采样但没有切片。不管怎样,你试过.groupby(df.index.ceil())
吗?还是.resample()
?关于ceil 和resample 的文档
【参考方案1】:
我找到了诀窍:
self.canvas.axes.scatter(df_day.index, df_day.loc[:, item], linestyle="None", marker='.')
self.canvas.axes.xaxis.set_major_locator(matplotlib.ticker.MultipleLocator(0.19))
self.canvas.axes.xaxis.set_major_formatter(mdates.DateFormatter('%d-%b %H:%M'))
【讨论】:
以上是关于如何为绘制的数据框设置时间过滤器 - Matplotlib的主要内容,如果未能解决你的问题,请参考以下文章
如何为matplotlib图例标签返回由分数内的上标组成的字符串? [复制]