2015-07-22 4 views
4

Мне нужно построить много строк, и я бы хотел показать их, поскольку они рассчитаны. Код выглядит примерно так:Динамическая перестановка

x = arange(100000) 
for y in range(100000): 
    ax.plot(x*y) 
    draw() 

Теперь, как вы можете себе представить, это замедляется очень быстро. То, что я думал, что я могу сделать, это сюжет, сохранить сюжет в буфер, очистить сюжет, заложить буфер в качестве фона и затем построить следующую строку. Таким образом, я не получаю так много объектов Line2D. У кого-нибудь есть идеи?

ответ

4

Кажется, что вам нужна функция matplotlib.animation. animation examples.

EDIT: Добавлен простой пример кода моей собственной версии.

import random 
from matplotlib import pyplot as plt 
from matplotlib import animation 

def data_generator(t): 
    if t<100: 
     return random.sample(range(100), 20) 

def init(): 
    return plt.plot() 

def animate(i): 
    data = data_generator(i) 
    return plt.plot(data, c='k') 

fig = plt.figure() 
anim = animation.FuncAnimation(fig, animate, init_func=init, frames=1000, interval=1000, blit=True) 
plt.show() 

EDIT2: Множественная линия версия автоматического обновления.

import random 
from matplotlib import pyplot as plt 
from matplotlib import animation 

def data_generator_1(t): 
    if t<100: 
     x1.append(t) 
     y1.append(random.randint(1, 100)) 

def data_generator_2(t): 
    if t<100: 
     x2.append(t) 
     y2.append(random.randint(1, 100)) 

def init(): 
    global x1 
    global y1 
    x1 = [] 
    y1 = [] 

    global x2 
    global y2 
    x2 = [] 
    y2 = [] 

    l1, l2 = plt.plot(x1, y1, x2, y2) 
    return l1, l2 

def animate(i): 
    data_generator_1(i) 
    data_generator_2(i) 
    l1, l2 = plt.plot(x1, y1, x2, y2) 
    plt.setp(l1, ls='--', c='k') 
    plt.setp(l2, c='gray') 
    return l1, l2 

fig = plt.figure() 
anim = animation.FuncAnimation(fig, animate, init_func=init, frames=1000, interval=1000, blit=True) 
plt.show() 

enter image description here

Я уверен, что есть много способов построения такого рода анимации без глобальных переменных. Это просто быстрое испытание, чтобы показать вам возможности того, что вы хотите.

Я не знаю о проблеме сценариев ipython/vanilla, которая рассматривается вашим первым комментарием. Все примеры кодируются в обычном редакторе (не ipython). Возможно, разница версий matplotlib.

+0

что странно, что это работает именно так, как я хочу, чтобы в IPython ноутбук, но не из файла сценария запуска из командной строки. К сожалению, мне нужен последний. – BossColo

+0

Я также получаю два продукта данных из генератора данных, которые необходимо построить. Я, вероятно, мог бы это понять самостоятельно, но если у вас есть понимание, я бы очень признателен! – BossColo

+0

Пояснение к моему первому комментарию: первая строчка построена на графике, но каждый последующий сюжет очищается до того, как появится следующий график. – BossColo

0

В качестве альтернативы, если вы используете ноутбук IPython, вы можете использовать функцию отображения IPython:

from IPython import display 
import matplotlib.pyplot as plt 
import numpy as np 
%matplotlib 

x = np.arange(100) 

for y in np.arange(100): 
    fig, ax = plt.subplots(1,1, figsize=(6,6)) 
    ax.plot(x * y) 
    ax.set_ylim(0, 10000) # to keep the axes always the same 
    display.clear_output(wait=True) 
    display.display(fig) 
    plt.close() 

Если вы хотите, чтобы в любой момент сказать, 10 строк нарисовали в то время, вы можете делать:

x = np.arange(100) 
fig, ax = plt.subplots(1,1, figsize=(6,6)) 
for y in np.arange(100):   
    ax.plot(x*y) 
    ax.set_ylim(0,10000) 
    display.clear_output(wait=True) 
    display.display(fig) 
    if y > 10:   # from the 10th iteration, 
     ax.lines.pop(0) # remove the first line, then the 2nd, etc.. 
         # but it will always be in position `0` 
plt.close() 

НТН

Смежные вопросы