我正在玩python2.7和pyqtgraph,我想在x轴上创建带有自定义日期时间标签的滚动时间图。因此,当有新的y值时,图形将向左滚动,新的点将在右侧绘制,当前y位置以及接收日期和时间在x轴上。我试图通过将随机整数推到y轴,将当前日期和时间推到x轴来模拟它。 我在Windows和Mint18(virtualbox)上测试了我的代码,它似乎运行得很好,但是当我将其移植到我的树莓(或beaglebone,同样的问题)上时,该代码显示出一种奇怪的行为。图形不移动,没有画线。没有任何反应,但x轴标签设置为当前日期和时间。
我尝试调试问题,但未成功。我怀疑是在x轴上附加的数据类型,这种情况发生在
self.data.append({'x': time.time(), 'y': np.random.randint(0, 100)})
x = [item['x'] for item in self.data]
y = [item['y'] for item in self.data]
self.curve.setData(x=x, y=y)
其中time.time()
被传递到tickStrings(self, values, scale, spacing)
返回的是numpy.float64时间戳的列表。
在这种情况下,情节不起作用,但是当我使用
self.t = QTime()
self.t.start()
和def update(self):
self.data.append({'x': self.t.elapsed()*1000, 'y': np.random.randint(0, 100)})
传递给tickStrings(self, values, scale, spacing):
的数据类型
是int,并且该图被绘制。但是现在x标签是自程序启动以来经过的时间,这不是我想要的。 但是当我做类似的事情
self.data.append({'x': self.t.elapsed()*1000000000000, 'y': np.random.randint(0, 100)})
传递的数据类型很长,但是该图被绘制,这非常令人困惑。
我还尝试传递从
创建的unix时间戳UNIX_EPOCH = datetime.datetime(1970, 1, 1, 0, 0)
TS_MULT_us = 1e6
def now_timestamp(ts_mult=TS_MULT_us, epoch=UNIX_EPOCH):
return(int((datetime.datetime.utcnow() - epoch).total_seconds()*ts_mult))s
这也没有用,所以现在我被卡住了。我也不确定问题是否出在数据类型上,但是我注意到每次添加整数时,绘图似乎都可以正常工作,但是使用long或float却不是这种情况。
覆盆子终端也不会抛出任何异常,因此我尝试了print type(x), x
和print "updating"
。
经过2次迭代
tickStrings()
和
update()
,
tickStrings()
不再被调用,而仅
update()
。好像是缓冲区或东西已满,
self.data.append({'x': time.time(), 'y': np.random.randint(0, 100)})
无法附加任何值。
我不确定如何继续调试此问题,也许有人对我有提示。 由于该问题仅发生在嵌入式Linux上: python在x64和arm系统上处理long和float数据类型的方式上是否存在主要差异,这可能是问题所在吗? 也许我应该检查一些有趣的日志文件?
uname -a返回
Linux raspberrypi 4.14.58-v7+ #1130 SMP Thu Jul 26 14:30:50 BST 2018 armv7l GNU/Linux
已安装最新更新,并且所用的pip包也是最新的。
感谢任何帮助,以及任何有用的一般注释,因为我是python greenhorn,并且仍然学习很多。
import sys
import numpy as np
from pyqtgraph.Qt import QtGui, QtCore
import pyqtgraph as pg
from PyQt4.QtCore import QTime, QTimer, QDateTime
from collections import deque
import datetime
import time
from pytz import utc
class TimeAxisItem(pg.AxisItem):
#from https://gist.github.com/friendzis/4e98ebe2cf29c0c2c232
def __init__(self, *args, **kwargs):
#super().__init__(*args, **kwargs) port to python2.7
super(TimeAxisItem, self).__init__(*args, **kwargs)
def tickStrings(self, values, scale, spacing):
#return [time.strftime("%d.%m.%y \n %H:%M:%S", time.localtime(value)) for value in values]
#debug, short above
strns = []
for x in values:
#debug
print type(x), x
try:
strns.append(time.strftime("%d.%m.%y \n %H:%M:%S", time.localtime(x)))
#strns.append(x.strftime("%d.%m.%y \n %H:%M:%S")) # time_t --> time.struct_time
except ValueError: # Windows can't handle dates before 1970
strns.append('')
return strns
class MyApplication(QtGui.QApplication):
def __init__(self, *args, **kwargs):
super(MyApplication, self).__init__(*args, **kwargs)
#debug
#self.t = QDateTime()
#self.t = QTime()
#self.t.start()
#deque fast performance container type alternative to classic lists
self.data = deque(maxlen=10)
self.win = pg.GraphicsWindow(title="Basic plotting examples")
self.win.resize(700,400)
self.plot = self.win.addPlot(title='Timed data', axisItems={'bottom': TimeAxisItem(orientation='bottom')})
self.curve = self.plot.plot()
self.tmr = QTimer()
self.tmr.timeout.connect(self.update)
self.tmr.start(1000)
def update(self):
#input x and y data here
print "updating"
#self.data.append({'x': self.t.elapsed()*1000000000000, 'y': np.random.randint(0, 100)})
#self.data.append({'x': self.t.elapsed()*1000, 'y': np.random.randint(0, 100)})
self.data.append({'x': time.time(), 'y': np.random.randint(0, 100)})
#debug
#print self.t.currentMSecsSinceEpoch()
#print type(self.t.elapsed()*1000)
x = [item['x'] for item in self.data]
y = [item['y'] for item in self.data]
self.curve.setData(x=x, y=y)
#print type(x)
#print x
#print y
def main():
app = MyApplication(sys.argv)
sys.exit(app.exec_())
if __name__ == '__main__':
main()