我需要你的帮助来编写一个Python脚本,它将采用动态变化的数据,这里的数据来源无关紧要,并在屏幕上显示图形。
我知道如何使用matplotlib,但matplotlib的问题是,我只能在脚本结尾处显示一次图形。我需要不仅能够一次显示图形,而且每次数据更改时都能动态更新图形。
我发现可以使用带有matplotlib的wxPython来实现这一点,但为我这样做有点复杂,因为我根本不熟悉wxPython。
所以如果有人向我展示如何使用带有matplotlib的wxPython来显示和更新简单图形的简单示例,我将非常高兴。 或者,如果是其他方式,这对我也有好处。
PS:
好的,因为没有人回答并查看了@janislaw注意到的matplotlib帮助,并编写了一些代码。这是一个虚拟的例子:
import time
import matplotlib.pyplot as plt
def data_gen():
a=data_gen.a
if a>10:
data_gen.a=1
data_gen.a=data_gen.a+1
return range (a,a+10)
def run(*args):
background = fig.canvas.copy_from_bbox(ax.bbox)
while 1:
time.sleep(0.1)
# restore the clean slate background
fig.canvas.restore_region(background)
# update the data
ydata = data_gen()
xdata=range(len(ydata))
line.set_data(xdata, ydata)
# just draw the animated artist
ax.draw_artist(line)
# just redraw the axes rectangle
fig.canvas.blit(ax.bbox)
data_gen.a=1
fig = plt.figure()
ax = fig.add_subplot(111)
line, = ax.plot([], [], animated=True)
ax.set_ylim(0, 20)
ax.set_xlim(0, 10)
ax.grid()
manager = plt.get_current_fig_manager()
manager.window.after(100, run)
plt.show()
此实现存在问题,例如,如果您尝试移动窗口,脚本会停止。但基本上可以使用它。
答案 0 :(得分:2)
作为matplotlib的替代品,Chaco库提供了很好的图形功能,并且在某些方面更适合实时绘图。
查看一些屏幕截图here,特别是,请参阅以下示例:
Chaco拥有qt和wx的后端,所以它在大多数情况下都能很好地处理你的基础细节。
答案 1 :(得分:2)
这是我写的一个处理这个问题的类。它需要一个传递给它的matplotlib图并将其放在GUI窗口中。它在自己的线程中,即使你的程序繁忙也能保持响应。
import Tkinter
import threading
import matplotlib
import matplotlib.backends.backend_tkagg
class Plotter():
def __init__(self,fig):
self.root = Tkinter.Tk()
self.root.state("zoomed")
self.fig = fig
t = threading.Thread(target=self.PlottingThread,args=(fig,))
t.start()
def PlottingThread(self,fig):
canvas = matplotlib.backends.backend_tkagg.FigureCanvasTkAgg(fig, master=self.root)
canvas.show()
canvas.get_tk_widget().pack(side=Tkinter.TOP, fill=Tkinter.BOTH, expand=1)
toolbar = matplotlib.backends.backend_tkagg.NavigationToolbar2TkAgg(canvas, self.root)
toolbar.update()
canvas._tkcanvas.pack(side=Tkinter.TOP, fill=Tkinter.BOTH, expand=1)
self.root.mainloop()
在你的代码中,你需要像这样初始化绘图仪:
import pylab
fig = matplotlib.pyplot.figure()
Plotter(fig)
然后你可以这样绘制:
fig.gca().clear()
fig.gca().plot([1,2,3],[4,5,6])
fig.canvas.draw()
答案 2 :(得分:1)
虽然不是基于离线GUI的程序,graphite可以从其自己的数据收集器(碳)中获取数据,并绘制将对实时数据做出反应的实时图表。
答案 3 :(得分:0)
而不是matplotlib.pyplot.show()
,您可以使用matplotlib.pyplot.show(block=False)
。此调用不会阻止程序进一步执行。
答案 4 :(得分:0)
动态情节的例子,秘密是在绘图时做暂停,这里我使用networkx:
G.add_node(i,)
G.add_edge(vertic[0],vertic[1],weight=0.2)
print "ok"
#pos=nx.random_layout(G)
#pos = nx.spring_layout(G)
#pos = nx.circular_layout(G)
pos = nx.fruchterman_reingold_layout(G)
nx.draw_networkx_nodes(G,pos,node_size=40)
nx.draw_networkx_edges(G,pos,width=1.0)
plt.axis('off') # supprimer les axes
plt.pause(0.0001)
plt.show() # display
答案 5 :(得分:0)
这是一个重复的问题:Dynamic Chart in Python,我找到了最好的方法,你可以在这里查看我的答案:http://litaotao.github.io/dynamic-charts-matplotlib-alternative-ipython-notebook-python-drawing-js
bellow是截图:
答案 6 :(得分:0)
我需要创建一个随时间更新的图形。我想到的最方便的解决方案是每次创建一个新图形。问题是在创建第一个图形后,脚本将不会执行,除非手动关闭窗口。 如下所示,通过打开交互模式避免了该问题
for i in range(0,100):
fig1 = plt.figure(num=1,clear=True) # a figure is created with the id of 1
createFigure(fig=fig1,id=1) # calls a function built by me which would insert data such that figure is 3d scatterplot
plt.ion() # this turns the interactive mode on
plt.show() # create the graph
plt.pause(2) # pause the script for 2 seconds , the number of seconds here determine the time after that graph refreshes
这里有两点要注意