相关疑难解决方法(0)

Matplotlib/PyPlot中的快速实时绘图

多年来,我一直在努力在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 = ...,则不会出现第二个图). …

matplotlib

34
推荐指数
2
解决办法
3万
查看次数

Matplotlib相当于pygame翻转

我有一个快速动画的程序,它在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)

python pygame numpy matplotlib

8
推荐指数
4
解决办法
477
查看次数

标签 统计

matplotlib ×2

numpy ×1

pygame ×1

python ×1