我需要写一个脚本在Python中,将采取动态变化的数据,数据的来源是不是问题在这里,并显示在屏幕上的图形。
我知道如何使用matplotlib,但matplotlib的问题是我只能在脚本的末尾显示一次图形。我需要能够不仅显示图形一次,而且还更新它的飞行,每次数据更改时。
我发现可以使用wxPython和matplotlib来实现这一点,但对我来说有点复杂,因为我对wxPython一点也不熟悉。
因此,如果有人能向我展示如何使用wxPython和matplotlib来显示和更新简单图形的简单示例,我将非常高兴。或者,如果有其他方法可以做到这一点,这对我也有好处。
更新
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()
这个实现有一些问题,比如如果你试图移动窗口,脚本会停止。但基本上可以使用。
6条答案
按热度按时间omjgkv6w1#
下面是我写的一个类来处理这个问题。它接受您传递给它的matplotlib图,并将其放置在GUI窗口中。它在自己的线程中,这样即使程序很忙碌,它也能保持响应。
在代码中,需要如下初始化绘图仪:
然后你可以像这样绘制它:
qncylg1j2#
作为matplotlib的替代品,查科库提供了很好的绘图功能,并且在某些方面更适合实时绘图。
请看一些屏幕截图here,特别是这些示例:
查科有qt和wx的后端,所以它在大多数时候都能很好地处理底层细节。
g52tjvyc3#
你可以使用
matplotlib.pyplot.show(block=False)
来代替matplotlib.pyplot.show()
。此调用不会阻止程序进一步执行。lfapxunr4#
动态绘图的例子,秘诀是在绘图时做一个暂停,这里我使用networkx:
bpsygsoo5#
我需要创建一个随时间更新的图表。我想到的最方便的解决方案是每次创建一个新的图形。问题是脚本在创建第一个图形后不会执行,除非手动关闭窗口。通过打开交互模式避免了该问题,如下所示
这里有两点要注意
1.图的id-如果图的id被改变,则每次将创建新的图,但是如果图的id相同,则相关的图将被更新。
1.pause函数-在指定的时间段内停止执行代码。如果不应用此选项,图形将几乎立即刷新
lsmd5eda6#
我已经创建了一个类,它用matplotlib绘图来绘制tkinter小部件。绘图动态更新(或多或少实时更新)。
以下是用于更新tkinter图中绘制的数据的自定义tkinter比例的示例。
上面的示例生成以下窗口。