Matplotlib хранения и удаления художника - PullRequest
0 голосов
/ 17 ноября 2018

Я столкнулся со странной проблемой с художниками matplotlib.

Отказ от ответственности: К сожалению, я когда-либо использовал matplotlib только в ноутбуках jupyter и в графическом интерфейсе tkinter (последний, где я нашел это), поэтому я не знаю, какнаписать простой код, который будет повторять проблему.Однако я не думаю, что пример - это код, который абсолютно необходим в этом случае.

Теперь проблема:

В целях ускорения построения графиков в графическом интерфейсе я не рисую все заново, когда элементыСюжет меняется, но лучше использовать такие методы, как set_ydata и canvas.draw.Иногда также необходимо полностью удалить строки, что можно сделать с помощью artist.remove.Вот проблема: Когда у меня есть один или несколько исполнителей, сохраненных в списке, я могу успешно удалить их из графика, перебирая список и вызывая remove.Однако, если я сохраню ссылку напрямую (как атрибут класса, управляющего графиками), вызов remove ничего не делает.

В качестве эскиза кода предположим, что у нас есть

import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot()

первый случай генерируется чем-то вроде

artist_list = list()
for x in range(5):
    line = ax.axhline(x)
    artist_list.append(line)

и может быть удален с помощью

for line in artist_list:
    line.remove()
artist_list = list()

(последний нужен для того, чтобы это работало).

тогда как второй будет

line = ax.axhline(1)
line.remove()

, который не удаляет линию из графика (даже если добавлены del line или line = None).

Кажется, что сохранение художника всписок, а затем присвоение этой переменной новому пустому списку является каким-то более полным удалением, чем переназначение переменной, в которой непосредственно хранится художник, или даже ее удаление.Кто-нибудь знает, что здесь происходит?Как удалить строку, если она просто хранится как line, а не как список?

1 Ответ

0 голосов
/ 17 ноября 2018

Как видно из приведенного ниже фрагмента кода, удаление строки довольно просто.В самом деле, вы просто вызываете .remove() для рассматриваемого объекта и перерисовываете холст.

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.set(title="Click to remove line", xlim=(0,2))

line=ax.axvline(1)

def remove_line(event):
    line.remove()
    fig.canvas.draw()

fig.canvas.mpl_connect("button_press_event", remove_line)

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