Прогрессирующий matplotlib FuncAnimation с помощью button_press_event - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь зарегистрировать button_press_event для функции on_click, которая используется для продвижения кадров функции animate, используемой matplotlib.animation.FuncAnimation.

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

data = [
    {'1': [(2000, 2000), (2050, 2000), (2050, 2100)],
     '2': [(1500, 1500), (1550, 1500), (1550, 1600)],
     '3': [(1700, 1700), (1750, 1700), (1750, 1850)],
    },
    {'1': [(4000, 2000), (5000, 2000), (6000, 2010)],
     '2': [(4500, 1500), (4505, 1500), (3505, 1510)],
     '3': [(4700, 1700), (6705, 1700), (5705, 1710)],
    },
    {'1': [(3300, 1000), (4080, 4000), (4000, 5010)],
     '2': [(3500, 3200), (3505, 2750), (2505, 1910)],
     '3': [(3700, 2600), (4705, 4100), (3705, 1310)],
    }
]


plots = {k: ax.plot([],[])[0] for d in data for k in d.keys()}

progress = False
def on_click(event):
    print('Event')
    global progress
    progress ^= True

def animate(i):
    d = data[i]

    while not progress:
        pass

    plots[k].set_data(list(zip(*v))) for k,v in d.items()]

fig.canvas.mpl_connect('button_press_event', on_click)
ani = animation.FuncAnimation(fig, animate, frames=len(data), interval=1000, repeat=False)
plt.show()

1 Ответ

0 голосов
/ 23 октября 2018

Я не уверен, что понимаю, почему вы вообще используете анимацию.Это то, что вы пытаетесь достичь?

import matplotlib.pyplot as plt

data = [
    {'1': [(2000, 2000), (2050, 2000), (2050, 2100)],
     '2': [(1500, 1500), (1550, 1500), (1550, 1600)],
     '3': [(1700, 1700), (1750, 1700), (1750, 1850)],
     },
    {'1': [(4000, 2000), (5000, 2000), (6000, 2010)],
     '2': [(4500, 1500), (4505, 1500), (3505, 1510)],
     '3': [(4700, 1700), (6705, 1700), (5705, 1710)],
     },
    {'1': [(3300, 1000), (4080, 4000), (4000, 5010)],
     '2': [(3500, 3200), (3505, 2750), (2505, 1910)],
     '3': [(3700, 2600), (4705, 4100), (3705, 1310)],
     }
]

fig, ax = plt.subplots()
plots = {k: ax.plot([], [])[0] for d in data for k in d.keys()}
current_frame = 0
max_frames = len(data)


def on_click(event):
    print('Event')
    global current_frame
    current_frame = (current_frame + 1) % max_frames
    d = data[current_frame]
    [plots[k].set_data(list(zip(*v))) for k, v in d.items()]
    ax.relim()
    ax.autoscale()
    fig.canvas.draw_idle()


fig.canvas.mpl_connect('button_press_event', on_click)
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...