Я предпочитаю, чтобы прослушиватели событий были развернуты модульной функцией, а не сценарием прослушивателя событий уровня 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
}
Существует несколько способов анимации графика matplotlib. Ниже мы рассмотрим два минимальных примера, используя график рассеяния.
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()
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()
Насколько я понимаю, вы хотите интерактивно обновить свой сюжет. Если это так, вы можете использовать график вместо графика рассеяния и обновлять данные вашего графика следующим образом.
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 и получить в этой функции новые точки, которые вы хотите построить (с управлением ввода-вывода или любым другим процессом, который вы используете). Надеюсь, это поможет.
ion
. +1 – roganjosh 11 March 2017 в 18:13