обновить данные о рассеянии matplotlib [дубликат]

Я предпочитаю, чтобы прослушиватели событий были развернуты модульной функцией, а не сценарием прослушивателя событий уровня document. Итак, мне нравится ниже. Обратите внимание: вы не можете переадресовать элемент с одним и тем же прослушивателем событий, поэтому не беспокойтесь о прикреплении слушателя более одного раза - только один палец.

var iterations = 4;
var button;
var body = document.querySelector("body");

for (var i = 0; i < iterations; i++) {
    button = document.createElement("button");
    button.classList.add("my-button");
    button.appendChild(document.createTextNode(i));
    button.addEventListener("click", myButtonWasClicked);
    body.appendChild(button);
}

function myButtonWasClicked(e) {
    console.log(e.target); //access to this specific button
}

4
задан Yair 10 March 2017 в 17:29
поделиться

2 ответа

Существует несколько способов анимации графика matplotlib. Ниже мы рассмотрим два минимальных примера, используя график рассеяния.

(a) использовать интерактивный режим plt.ion()

. Для анимации нам нужен цикл событий. Один из способов получения цикла событий - использовать plt.ion() («интерактивный»). Затем нужно сначала нарисовать фигуру и затем обновить график в цикле. Внутри цикла нам нужно нарисовать холст и ввести небольшую паузу для окна для обработки других событий (например, взаимодействия с мышью и т. Д.). Без этой паузы окно замерзло. Наконец, мы вызываем plt.waitforbuttonpress(), чтобы окно оставалось открытым даже после завершения анимации.

import matplotlib.pyplot as plt
import numpy as np

plt.ion()
fig, ax = plt.subplots()
x, y = [],[]
sc = ax.scatter(x,y)
plt.xlim(0,10)
plt.ylim(0,10)

plt.draw()
for i in range(1000):
    x.append(np.random.rand(1)*10)
    y.append(np.random.rand(1)*10)
    sc.set_offsets(np.c_[x,y])
    fig.canvas.draw_idle()
    plt.pause(0.1)

plt.waitforbuttonpress()

(b) с использованием FuncAnimation

. Многое из вышеизложенного может быть автоматизировано с использованием matplotlib.animation.FuncAnimation . FuncAnimation позаботится о цикле и перерисовке и будет постоянно вызывать функцию (в данном случае animate()) по истечении заданного интервала времени. Анимация запускается только после вызова plt.show(), тем самым автоматически запускается в цикле событий окна графика.

import matplotlib.pyplot as plt
import matplotlib.animation
import numpy as np

fig, ax = plt.subplots()
x, y = [],[]
sc = ax.scatter(x,y)
plt.xlim(0,10)
plt.ylim(0,10)

def animate(i):
    x.append(np.random.rand(1)*10)
    y.append(np.random.rand(1)*10)
    sc.set_offsets(np.c_[x,y])

ani = matplotlib.animation.FuncAnimation(fig, animate, 
                frames=2, interval=100, repeat=True) 
plt.show()
13
ответ дан ImportanceOfBeingErnest 17 August 2018 в 13:54
поделиться
  • 1
    Я не знаю, как я мог так долго и никогда не знать о ion. +1 – roganjosh 11 March 2017 в 18:13
  • 2
    Спасибо за подробный ответ. Безусловно, самое ясное дело в этом вопросе! – Yair 14 March 2017 в 11:31
  • 3
    Я рад, что это помогло. Если вы еще этого не сделали, вы можете повысить. – ImportanceOfBeingErnest 14 March 2017 в 12:42

Насколько я понимаю, вы хотите интерактивно обновить свой сюжет. Если это так, вы можете использовать график вместо графика рассеяния и обновлять данные вашего графика следующим образом.

import numpy
import matplotlib.pyplot as plt 
fig = plt.figure()
axe = fig.add_subplot(111)
X,Y = [],[]
sp, = axe.plot([],[],label='toto',ms=10,color='k',marker='o',ls='')
fig.show()
for iter in range(5):
    X.append(numpy.random.rand())
    Y.append(numpy.random.rand())
    sp.set_data(X,Y)
    axe.set_xlim(min(X),max(X))
    axe.set_ylim(min(Y),max(Y))
    raw_input('...')
    fig.canvas.draw()

Если это поведение, которое вы ищете, вам просто нужно создать функцию, добавляющую данные sp и получить в этой функции новые точки, которые вы хотите построить (с управлением ввода-вывода или любым другим процессом, который вы используете). Надеюсь, это поможет.

2
ответ дан aTben0 17 August 2018 в 13:54
поделиться
  • 1
    Спасибо, но он, похоже, не работает полностью. Вместо того, чтобы строить данные в каждом раунде сбора данных, я получаю пустой холст до тех пор, пока код запускается, и как только он заканчивается, я получаю все данные одновременно (т. Е. Верхнее изображение в моем вопросе). – Yair 10 March 2017 в 17:57
  • 2
    @ aTben0 Интересно, в какой среде это решение будет работать, поскольку явно отсутствует цикл событий. – ImportanceOfBeingErnest 11 March 2017 в 18:13
  • 3
    @ImportanceOfBeingErnest Поскольку опубликованная проблема помечена как matplotlib и разброс, я думал об управлении вводом-выводе, которое ожидало бы обновления файла, а затем добавляет X и Y, как только файл будет изменен. Если это так, я не понимаю, зачем нужен интерактивный режим, или мне что-то не хватает? В любом случае, спасибо за ваш полный ответ и комментарий. – aTben0 11 March 2017 в 21:07
  • 4
    Вы пропустите цикл событий, и интерактивный режим является одним из способов его получения. – ImportanceOfBeingErnest 11 March 2017 в 21:19
Другие вопросы по тегам:

Похожие вопросы: