【发布时间】:2018-07-01 13:11:45
【问题描述】:
我对 python 世界很陌生,不幸的是我还没有找到任何解决方案。
我在 Mac OS X 10.13.2 上运行带有 matplotlib==1.3.1 的 python 3.6
目前我正在尝试构建一个小软件,它以 4Hz 的频率获取数据,并以 1Hz 的频率在绘图中显示获取的数据。因此,我创建了一个在线程中运行以获取数据的类和另一个用于更新实际绘图的类。在这两者之间有一个数据类,它将保存数据并用作两个类之间的接口。
import matplotlib.pyplot as plt
import numpy as np
import threading
import random
import time
class MyDataClass():
def __init__(self):
self.XData = [0]
self.YData = [0]
class MyPlotClass(threading.Thread):
def __init__(self, dataClass):
threading.Thread.__init__(self)
self._dataClass = dataClass
self._period = 1
self._nextCall = time.time()
self.hLine, = plt.plot(0, 0)
plt.ion()
def run(self):
while True:
self.hLine.set_data(self._dataClass.XData, self._dataClass.YData)
plt.draw()
print("updated %i datapoints" % len(self._dataClass.XData))
# sleep until next execution
self._nextCall = self._nextCall + self._period
time.sleep(self._nextCall - time.time())
class MyDataFetchClass(threading.Thread):
def __init__(self, dataClass):
threading.Thread.__init__(self)
self._dataClass = dataClass
self._period = 0.25
self._nextCall = time.time()
def run(self):
while True:
# add data to data class
self._dataClass.XData.append(self._dataClass.XData[-1] + 1)
self._dataClass.YData.append(random.randint(0, 256))
print("Added (%i, %i)" % (self._dataClass.XData[-1], self._dataClass.YData[-1]))
# sleep until next execution
self._nextCall = self._nextCall + self._period
time.sleep(self._nextCall - time.time())
data = MyDataClass()
fetcher = MyDataFetchClass(data)
plotter = MyPlotClass(data)
fetcher.start()
plotter.start()
fetcher.join()
plotter.join()
由于命令行输出,我可以看到线程正在运行。但由于某种原因,持有情节的人不会出现。
火箭符号只会上下弹跳而不是出现。见附件截图。
仅创建绘图并使用 plt.show() 命令的简单示例可以正常工作。
我不知道我做错了什么。我希望你们中的任何人都可以有一个想法。
谢谢!
编辑:这里提出的解决方案How to update a plot in matplotlib? 对我不起作用,因为我不想被限制在一定数量的帧上(使用 Matplotlib 的动画框架)。我需要用 1Hz 不断更新绘图。
【问题讨论】:
-
您可以使用 Qt 信号在主线程中调用您的绘图函数。 stackoverflow.com/questions/19662906/…
标签: python multithreading macos matplotlib python-multithreading