Изменить данные y в строке - PullRequest
0 голосов
/ 20 мая 2019

У меня есть следующий скрипт

import matplotlib.pyplot as plt                                                  

x = [1, 2, 3, 4, 5] 
fig, ax = plt.subplots() 
# draw a horizontal line y=0
line, = ax.plot(x, [0 for _ in x]) 
def mod_ydata(ev): 
    X = ev.xdata 
    if X is not None: 
        n = round(X) 
        line.set_ydata([n for _ in x]) 
        fig.canvas.draw_idle() 
fig.canvas.mpl_connect('button_press_event', mod_ydata)                          
plt.show()
  • Ожидаемое поведение исходная горизонтальная линия y = 0 очищается в ответ на щелчок мыши и новую горизонтальную линию, y = round (х) где x - абсцисса щелчка мыши.

  • Неожиданное поведение исходная горизонтальная линия очищается и новая горизонтальная линия не рисуется.

Я проверил в интерактивном терминале IPython, используя line.get_ydata(), что обратный вызов действительно обновляет ординаты.

Я должен сказать, что я играл с plt.ion(), повторяя plt.show() в обратном вызове, используя a1.draw() и т. Д. Всегда безрезультатно.

Я понимаю, что, возможно, мне не хватает очевидного, но вот я ...

1 Ответ

0 голосов
/ 20 мая 2019

Ваш код работает нормально, он просто рисует линию за пределами видимых y-пределов.

  • либо вы заранее применяете надлежащие y-пределы (например, используя ax.set_ylim(-1,5) перед plt.show())
  • или вы добавляете следующие строки внутри mod_ydata() прямо перед вызовом fig.canvas.draw_idle():
ax.relim()
ax.autoscale_view()

, хотя последний делает "движение" вида линиитрудно увидеть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...