多年来,我一直在努力在matplotlib中获得高效的实时绘图,直到今天我仍然不满意.
我想要一个redraw_figure更新图形"实时"(如代码运行)的函数,并且如果我在断点处停止,将显示最新的图.
这是一些演示代码:
import time
from matplotlib import pyplot as plt
import numpy as np
def live_update_demo():
plt.subplot(2, 1, 1)
h1 = plt.imshow(np.random.randn(30, 30))
redraw_figure()
plt.subplot(2, 1, 2)
h2, = plt.plot(np.random.randn(50))
redraw_figure()
t_start = time.time()
for i in xrange(1000):
h1.set_data(np.random.randn(30, 30))
redraw_figure()
h2.set_ydata(np.random.randn(50))
redraw_figure()
print 'Mean Frame Rate: %.3gFPS' % ((i+1) / (time.time() - t_start))
def redraw_figure():
plt.draw()
plt.pause(0.00001)
live_update_demo()
Run Code Online (Sandbox Code Playgroud)
在运行代码时,绘图应该更新,并且我们应该在之后的任何断点处停止时看到最新数据redraw_figure().问题是如何最好地实施redraw_figure()
在上面的实现(plt.draw(); plt.pause(0.00001))中,它可以工作,但速度非常慢(~3.7FPS)
我可以实现它:
def redraw_figure():
plt.gcf().canvas.flush_events()
plt.show(block=False)
Run Code Online (Sandbox Code Playgroud)
并且它运行得更快(~11FPS),但是当您在断点处停止时,情节不是最新的(例如,如果我在线上放置断点t_start = ...,则不会出现第二个图). …
我有一个快速动画的程序,它在pygame下运行得很好,而且由于技术原因,我需要使用matplotlib或其他普遍的模块来做同样的事情.
程序结构大致如下:
pygame.init()
SURF = pygame.display.set_mode((500, 500))
arr = pygame.surfarray.pixels2d(SURF) # a view for numpy, as a 2D array
while ok:
# modify some pixels of arr
pygame.display.flip()
pygame.quit()
Run Code Online (Sandbox Code Playgroud)
我没有低级别的matplotlib经验,但我认为可以用matplotlib做同等的事情.换一种说法 :
如何共享图形的位图,修改一些像素并刷新屏幕?
这是一个最小的工作例子,它在我的计算机上翻转250帧/秒(超过屏幕......):
import pygame,numpy,time
pygame.init()
size=(400,400)
SURF = pygame.display.set_mode(size)
arr = pygame.surfarray.pixels2d(SURF) # buffer pour numpy
t0=time.clock()
for counter in range(1000):
arr[:]=numpy.random.randint(0,0xfffff,size)
pygame.display.flip()
pygame.quit()
print(counter/(time.clock()-t0))
Run Code Online (Sandbox Code Playgroud)
编辑
我在答案中尝试了指示:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
fig = plt.figure()
def f(x, y):
return np.sin(x) + np.cos(y) …Run Code Online (Sandbox Code Playgroud)