如何为绘制的数据框设置时间过滤器 - 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()])

但是,由于 hours 的值每天都在重复,并且在整个数据帧中重复,所以绘图没有正确绘制,如下图所示:

【问题讨论】:

@TrentonMcKinney 感谢传奇成功,太棒了。至于时间过滤器,我尝试将 df.index.monthdf.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图例标签返回由分数内的上标组成的字符串? [复制]

MFC:如何为所有者绘制渲染 Aero 风格的组合框?

如何为seaborn histplot绘制奇数个子图

如何为文本框设置数据类型[重复]

如何为 Dummies 筛选 Azure 日志或 WCF 数据服务筛选器

如何为列表框中的每个项目设置不同的工具提示文本?