如何使用 PyQtGraph 的 DateAxisItem?

Posted

技术标签:

【中文标题】如何使用 PyQtGraph 的 DateAxisItem?【英文标题】:How can I use DateAxisItem of PyQtGraph? 【发布时间】:2018-08-09 08:35:56 【问题描述】:

我在 Python 3.6.2(32 位)和 Windows 10 上使用 PyQtGraph '0.9.8+gd627e39'。

我的目标是绘制带有显示日期时间的 X 轴的实时数据。

Time                                                Value
datetime.datetime(2018, 3, 1, 9, 36, 50, 136415)    10
datetime.datetime(2018, 3, 1, 9, 36, 51, 330912)    9
datetime.datetime(2018, 3, 1, 9, 36, 51, 382815)    12
datetime.datetime(2018, 3, 1, 9, 36, 52, 928818)    11
...

我查找了相关问题,例如 https://gist.github.com/friendzis/4e98ebe2cf29c0c2c232,pyqtgraph, plotting time series,但是我还是很难掌握DateAxisItem的使用方法

我尝试使用该模块制作一个简单的代码,

import numpy as np
import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui
from datetime import datetime
from time import time

t1 = datetime.now()
t2 = datetime.now()

list_x = [ t1, t2 ]
list_y = [ 0, 1 ]

date_axis = pg.graphicsItems.DateAxisItem.DateAxisItem(orientation = 'bottom')
graph = pg.PlotWidget(axisItems = 'bottom': date_axis)

graph.plot(x=list_x, y=list_y, pen=None, symbol='o')
graph.show()

但它显示一条错误消息并且根本不显示它的 X 轴。

Traceback (most recent call last):
File "<tmp 10>", line 19, in <module>
    graph.plot(x=list_x, y=list_y, pen=None, symbol='o')
File "d:\python36-32\lib\site-packages\pyqtgraph\graphicsItems\PlotItem\PlotItem.py", line 636, in plot
    item = PlotDataItem(*args, **kargs)
File "d:\python36-32\lib\site-packages\pyqtgraph\graphicsItems\PlotDataItem.py", line 177, in __init__
    self.setData(*args, **kargs)
File "d:\python36-32\lib\site-packages\pyqtgraph\graphicsItems\PlotDataItem.py", line 461, in setData
    self.updateItems()
File "d:\python36-32\lib\site-packages\pyqtgraph\graphicsItems\PlotDataItem.py", line 493, in updateItems
    self.scatter.setData(x=x, y=y, **scatterArgs)
File "d:\python36-32\lib\site-packages\pyqtgraph\graphicsItems\ScatterPlotItem.py", line 308, in setData
    self.addPoints(*args, **kargs)
File "d:\python36-32\lib\site-packages\pyqtgraph\graphicsItems\ScatterPlotItem.py", line 388, in addPoints
    newData['x'] = kargs['x']
TypeError: float() argument must be a string or a number, not 'datetime.datetime'

是因为DateAxisItem 不支持日期时间吗?如果能通过看代码看懂模块就好了,可惜我的技术不好。

如果有人能通过一些简单的数据向我展示如何使用该模块,我将不胜感激。

【问题讨论】:

【参考方案1】:

基于之前的answer,pyqtgraph 中的绘图只接受数字类型的数据,因此您必须对其进行转换,对于这种情况,我们使用timestamp(),然后在自定义AxisItem 中将其转换为字符串以显示在fromtimestamp 的帮助下。

import numpy as np
import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui
from datetime import datetime


class TimeAxisItem(pg.AxisItem):
    def tickStrings(self, values, scale, spacing):
        return [datetime.fromtimestamp(value) for value in values]

list_x = [datetime(2018, 3, 1, 9, 36, 50, 136415), 
        datetime(2018, 3, 1, 9, 36, 51, 330912),
        datetime(2018, 3, 1, 9, 36, 51, 382815),
        datetime(2018, 3, 1, 9, 36, 52, 928818)]

list_y = [10, 9, 12, 11]

app = QtGui.QApplication([])

date_axis = TimeAxisItem(orientation='bottom')
graph = pg.PlotWidget(axisItems = 'bottom': date_axis)

graph.plot(x=[x.timestamp() for x in list_x], y=list_y, pen=None, symbol='o')
graph.show()

if __name__ == '__main__':
    import sys
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()

【讨论】:

非常感谢您的回答和示例代码!祝你有美好的一天! :) 你是 SO 上最天才的 pyqt 编码器。 :)

以上是关于如何使用 PyQtGraph 的 DateAxisItem?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PyQtgraph 更改绘图的刻度字体大小

如何使用 pyqtgraph 和 QSerialPort 创建实时图?

如何在 pyqtgraph 中写 \latex 字符?

如何使用 PyQtGraph 获取堆栈图?

如何使用 PyQtGraph 绘制图像上两点之间的水平距离

如何使用 pyqtgraph 得到一个简单的绘图