我试图使用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个点.实际发生的是窗口弹出第一个点显示(确定),然后在填充图表的其余部分之前等待循环完成.
有什么想法,为什么我没有看到一次填充一个点?
我在Python中创建一个应用程序,它从串行端口收集数据,并根据到达时间绘制收集数据的图表.数据的到达时间不确定.我希望在收到数据时更新绘图.我搜索了如何做到这一点,并找到了两种方法:
我不喜欢第一个,因为程序运行并收集数据很长一段时间(例如一天),重绘绘图将非常慢.第二个也不是优选的,因为数据的到达时间是不确定的,并且我希望仅在接收到数据时更新图.
有没有办法只通过在收到数据时添加更多的点来更新图表?
我有一个复杂的算法,可以更新存储在数组中的3个直方图.我想调试我的算法,所以我想在用户界面中将数组显示为直方图.最简单的方法是什么?(快速应用程序开发比优化代码更重要.)
我有一些Qt(在C++中)的经验和matplotlib的一些经验.
(我将暂时搁置这个问题一两天,因为我很难在没有更多经验的情况下评估解决方案.希望社群的投票能帮助我们选择最佳答案.)
所以我有一个meshgrid(矩阵X和Y)以及标量数据(矩阵Z),我需要将其可视化.优选地,一些2D图像在其中显示Z值的点处具有颜色.我做了一些研究,但没有发现任何我想要的东西.
pyplot.imshow(Z)具有良好的外观,但它不需要我的X和Y矩阵,因此轴是错误的,它不能处理由X和Y给出的非线性间隔点.
pyplot.pcolor(X,Y,Z)使颜色正方形的颜色与其一个角上的数据相对应,因此它会错误地表示数据(它应该在其中心显示数据或其他内容).此外,它忽略数据矩阵中的两条边.
我很确定在Matplotlib中某处必须存在一些更好的方法,但是文档很难得到概述.所以我在问别人是否知道更好的方法.奖励,如果它允许我刷新矩阵Z来制作动画.
我有一个模拟计算每次模拟迭代的表面数据.我想连续将该数据绘制为同一窗口的表面图(在每次迭代中更新图),以便了解它是如何演变的并检查算法.
我的想法是创建一个类来初始化窗口/绘图,然后从模拟循环内部重绘到该窗口.这是我提出的课程:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FixedLocator, FormatStrFormatter
import matplotlib
matplotlib.interactive( False )
class plot3dClass( object ):
def __init__( self, systemSideLength, lowerCutoffLength ):
self.systemSideLength = systemSideLength
self.lowerCutoffLength = lowerCutoffLength
self.fig = plt.figure()
self.ax = self.fig.add_subplot( 111, projection='3d' )
self.ax.set_zlim3d( -10e-9, 10e9 )
X = np.arange( 0, self.systemSideLength, self.lowerCutoffLength )
Y = X
self.X, self.Y = np.meshgrid(X, Y)
self.ax.w_zaxis.set_major_locator( LinearLocator( 10 ) )
self.ax.w_zaxis.set_major_formatter( FormatStrFormatter( …
Run Code Online (Sandbox Code Playgroud) 我正在一个线程中从套接字读取数据,并希望在新数据到达时绘制和更新绘图.我编写了一个小型原型来模拟事物,但它不起作用:
import pylab
import time
import threading
import random
data = []
# This just simulates reading from a socket.
def data_listener():
while True:
time.sleep(1)
data.append(random.random())
if __name__ == '__main__':
thread = threading.Thread(target=data_listener)
thread.daemon = True
thread.start()
pylab.figure()
while True:
time.sleep(1)
pylab.plot(data)
pylab.show() # This blocks :(
Run Code Online (Sandbox Code Playgroud) 我正在处理来自许多天线基线的观测数据.目前我正在工作的是绘制~40个数字,每个数字都有4x5子图区域.我发现在使用matplotlib在循环中绘制和保存数字时速度很慢.这是我的代码:
import numpy as np
import matplotlib.pyplot as plt
import time
...
PLT_PAGE_NUM = 39 # default is 39
SUB_PLT_NUM = 20 # default is 20
for pp in xrange(0,PLT_PAGE_NUM):
plt.figure(figsize=(20,12))
start_time = time.clock()
for kk in xrange(0,SUB_PLT_NUM):
plt.subplot(5,4,kk+1)
plt.plot(np.arange(0,TIME_LENGTH), xcor_real_arr[20*pp+kk,0:],'r-',
range(0,TIME_LENGTH), xcor_imag_arr[20*pp+kk,0:],'b-')
plt.title('XCOR of '+ ind_arr[20*pp+kk], color='k')
plt.savefig('test_imag_real'+str(pp)+'.png',format='png',dpi=100)
print 'Fig-'+str(pp)+' has been saved'
print "Excution time:", time.clock()-start_time
Run Code Online (Sandbox Code Playgroud)
执行时间信息是:
######### Check your inputs setting #########
You have selected 2 files.
The time interval is From 2011-10-20_14:28:38 to 2011-10-20_15:10:54
Your time …
Run Code Online (Sandbox Code Playgroud) 我正在尝试更新matplotlib图,如下所示:
import matplotlib.pyplot as plt
import matplotlib.dates as mdate
import numpy as np
plt.ion()
fig = plt.figure()
ax = fig.add_subplot(111)
for i,(_,_,idx) in enumerate(local_minima):
dat = dst_data[idx-24:idx+25]
dates,values = zip(*dat)
if i == 0:
assert(len(dates) == len(values))
lines2d, = ax.plot_date(mdate.date2num(dates), np.array(values), linestyle='-')
else:
assert(len(dates) == len(values))
lines2d.set_ydata(np.array(values))
lines2d.set_xdata(mdate.date2num(dates)) #This line causes problems.
fig.canvas.draw()
raw_input()
Run Code Online (Sandbox Code Playgroud)
第一次通过循环,图表显示正常.第二次循环,我的绘图上的所有数据都消失了 - 如果我不包括该lines2d.set_xdata
行(除了x数据点当然是错误的)之外,一切正常.我查看了以下帖子:
和
但是,在这两种情况下,用户只更新了ydata
,我也想更新xdata
.
我有一个matplotlib
hexbin
嵌入在GTK.Window
图表中的一些数据(x,y).我希望在plot
收到新数据时更新(通过UDP
).我虽然遇到了一些麻烦.
我可以通过几种不同的方式使它工作,但没有一种是"有效的"(含义 - 重绘plot
时间过长).我看了一下这个并尝试在建议的答案之后对我的hexbin进行建模,但根本无法使其工作.我一直收到以下错误:
TypeError: 'PolyCollection' object is not iterable.
我猜测hexbins
不能以与标准相同的方式更新plots
.
示例代码:
class graph:
def __init__(self):
self.window = gtk.Window()
self.figure = plt.figure()
self.ax = self.figure.add_subplot(111)
self.canvas = FigureCanvas(self.figure)
self.window.add(self.canvas)
self.graph = None
def plot(self, xData, yData):
if len(xData) > 1 and len(yData) > 1:
self.graph, = self.ax.hexbin(self.xData, self.yData)
###############################################
####This is where the code throws the error####
def update(self, xData, yData):
self.graph.set_xdata(np.append(self.graph.get_xdata(), xData)) …
Run Code Online (Sandbox Code Playgroud) 我的目标是创建一个输出数字的函数。
如果我尝试在脚本中多次调用我的函数,它只会显示第一次调用的数字。只有当我关闭第一个图形时,程序才会创建第二个图形,依此类推。
我的功能大致如下:
def graphs(...,fig):
...
ax = plt.figure(fig)
...
...
plt.show
Run Code Online (Sandbox Code Playgroud)
目前该函数不返回任何内容,有没有办法可以输出图形或至少使其在第一个图形之后不会停止创建图形?