2012-06-05 4 views
6

Я новичок в matplotlib. У меня есть список x-y-координат, которые я обновляю на python и хочу оживить с помощью mplotlib's pyplot. Я хочу заранее указать диапазон x и y-диапазон. Ниже мой текущий код:Простая анимация 2D-координат с использованием matplotlib и pyplot

import matplotlib.pyplot as plt 
x=[1,2,3,4] 
y=[5,6,7,8] 
for t in range(100): 
    #lists x and y get updated here 
    #... 
plt.plot(x, y, marker='o', linestyle='None') 
plt.show() 

Как вы можете видеть, я использую plt.plot() и plt.show()в конце моей итерации цикла построить только окончательные координаты. Но я хочу поставить этот шаг внутри цикл и график на каждой итерации с указанным временем паузы, чтобы у меня была анимация по мере запуска цикла.

Просто перемещение этого утверждения внутри цикла или его настройка не работают. Я хочу, чтобы это было очень просто, и не хочу использовать matplotlib.animation. Есть ли какой-то простой метод без использования большего количества модулей и библиотек (только такие вещи, как plt.pause() и, возможно, только немного больше), которые позволят мне делать то, что я хочу?

Я смотрел много мест в Интернете, и проблема, с которой я сталкиваюсь с большинством методов, заключается в том, что я использую для этого python (x, y) (это python версия 2.7) для Windows и анимации с использованием слишком сложных модулей и библиотек здесь рушится.

Тем не менее, я могу использовать простые вещи, такие как this example на сайте matplotlib, что близко к тому, что я хочу, но не совсем. Поэтому, возможно, лучше всего будет изменение этого примера, которое работает для моего случая 2D-данных (этот пример относится к 1-й строке). Но любое другое предложение приветствуется.

ответ

8

Это взят из animation demo:

import matplotlib.pyplot as plt 
import numpy as np 

fig, ax = plt.subplots() 

x = [1, 2, 3, 4] 
y = [5, 6, 7, 8] 

for t in range(10): 
    if t == 0: 
     points, = ax.plot(x, y, marker='o', linestyle='None') 
     ax.set_xlim(0, 10) 
     ax.set_ylim(0, 10) 
    else: 
     new_x = np.random.randint(10, size=5) 
     new_y = np.random.randint(10, size=5) 
     points.set_data(new_x, new_y) 
    plt.pause(0.5) 

В то время как это просто строка документация говорит, что это очень медленный процесс.

+0

+1. Это работает. Я просто попытаюсь приспособить его к моей последней программе и посмотреть, как это происходит. –

+0

Это отлично поработало с моей программой. Принято. И спасибо! –

+0

Может быть удобно использовать 'ax.clear()'; то вы можете просто нарисовать новую фигуру, и вам не нужно различать первый и более поздний прогоны. Кроме того, 'plt.pause()' вызвал ошибку для меня, вместо этого я использовал 'fig.canvas.start_event_loop()'. – Scipio

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