我试图使用OpenCV实时绘制来自摄像机的一些数据.但是,实时绘图(使用matplotlib)似乎不起作用.
我把这个问题分成了这个简单的例子:
fig = plt.figure()
plt.axis([0, 1000, 0, 1])
i = 0
x = list()
y = list()
while i < 1000:
temp_y = np.random.random()
x.append(i)
y.append(temp_y)
plt.scatter(i, temp_y)
i += 1
plt.show()
Run Code Online (Sandbox Code Playgroud)
我希望这个例子可以单独绘制1000个点.实际发生的是窗口弹出第一个点显示(确定),然后在填充图表的其余部分之前等待循环完成.
有什么想法,为什么我没有看到一次填充一个点?
我在这里重新绘制数字时遇到问题.我允许用户在时间刻度(x轴)中指定单位,然后重新计算并调用此函数plots().我希望情节简单地更新,而不是在图中附加另一个情节.
def plots():
global vlgaBuffSorted
cntr()
result = collections.defaultdict(list)
for d in vlgaBuffSorted:
result[d['event']].append(d)
result_list = result.values()
f = Figure()
graph1 = f.add_subplot(211)
graph2 = f.add_subplot(212,sharex=graph1)
for item in result_list:
tL = []
vgsL = []
vdsL = []
isubL = []
for dict in item:
tL.append(dict['time'])
vgsL.append(dict['vgs'])
vdsL.append(dict['vds'])
isubL.append(dict['isub'])
graph1.plot(tL,vdsL,'bo',label='a')
graph1.plot(tL,vgsL,'rp',label='b')
graph2.plot(tL,isubL,'b-',label='c')
plotCanvas = FigureCanvasTkAgg(f, pltFrame)
toolbar = NavigationToolbar2TkAgg(plotCanvas, pltFrame)
toolbar.pack(side=BOTTOM)
plotCanvas.get_tk_widget().pack(side=TOP)
Run Code Online (Sandbox Code Playgroud) 我目前正在评估不同的python绘图库.现在我正在尝试使用matplotlib,我对性能非常失望.以下示例是从SciPy示例中修改的,并且每秒仅给出~8帧!
有什么方法可以加快速度,或者我应该选择不同的绘图库?
from pylab import *
import time
ion()
fig = figure()
ax1 = fig.add_subplot(611)
ax2 = fig.add_subplot(612)
ax3 = fig.add_subplot(613)
ax4 = fig.add_subplot(614)
ax5 = fig.add_subplot(615)
ax6 = fig.add_subplot(616)
x = arange(0,2*pi,0.01)
y = sin(x)
line1, = ax1.plot(x, y, 'r-')
line2, = ax2.plot(x, y, 'g-')
line3, = ax3.plot(x, y, 'y-')
line4, = ax4.plot(x, y, 'm-')
line5, = ax5.plot(x, y, 'k-')
line6, = ax6.plot(x, y, 'p-')
# turn off interactive plotting - speeds things up by 1 Frame …Run Code Online (Sandbox Code Playgroud) 我想创建一个实时图形绘图程序,它从串口输入.最初,我尝试了很多在网站上发布的代码,但都没有.所以,我决定通过集成我在网站上看到的代码片段来自己编写代码.但问题是图形将仅在程序结束时弹出,换句话说,在循环之外.在循环中,它没有显示任何内容,只是一个空白的画布.我仍然是python的新手.这是我的代码.
import matplotlib.pyplot as plt
import time
import random
from collections import deque
import numpy as np
# simulates input from serial port
def random_gen():
while True:
val = random.randint(1,10)
yield val
time.sleep(0.1)
a1 = deque([0]*100)
ax = plt.axes(xlim=(0, 20), ylim=(0, 10))
d = random_gen()
line, = plt.plot(a1)
plt.ion()
plt.ylim([0,10])
plt.show()
for i in range(0,20):
a1.appendleft(next(d))
datatoplot = a1.pop()
line.set_ydata(a1)
plt.draw()
print a1[0]
i += 1
time.sleep(0.1)
Run Code Online (Sandbox Code Playgroud)
另外,我使用Enthought Canopy学术许可证ver 1.1.0.
我对 python 世界还很陌生,不幸的是我还找不到任何解决方案。
我在 Mac OS X 10.13.2 上运行 python 3.6 和 matplotlib==1.3.1
目前我正在尝试构建一个小型软件,它以 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 …Run Code Online (Sandbox Code Playgroud) python macos multithreading matplotlib python-multithreading