Удаление аннотации из цикла for - PullRequest
0 голосов
/ 31 августа 2018

Проблема в том, что aux1.remove() не удаляет аннотации, добавленные к точкам разброса.

Но aux.remove() удаляет точки разброса. Поэтому, в конце концов, я получаю много аннотаций, когда продолжаю добавлять / удалять новые точки.

aux = plt.scatter(obj_dy[:], obj_dx[:], color='green')

for k in range(len(obj_index)):
    aux1 = plt.annotate(str(obj_index[k]), xy = (obj_dy[k], obj_dx[k]))
plt.pause(0.1000)
aux.remove()
aux1.remove()

1 Ответ

0 голосов
/ 31 августа 2018

Проблема в том, что создание аннотаций находится внутри цикла for. Когда вы делаете aux1.remove(), вы удаляете только последнюю аннотацию на осях.

Одним из решений было бы поместить aux1 в список и после завершения цикла for выполнить цикл по списку и удалить аннотации:

aux = plt.scatter(obj_dy[:], obj_dx[:], color='green')

aux1_list = [] # empty list that the annotation will go in

for k in range(len(obj_index)):
    aux1 = plt.annotate(str(obj_index[k]), xy = (obj_dy[k], obj_dx[k]))
    aux1_list.append(aux1)

plt.pause(0.1)
aux.remove() # remove scatter points

# remove annotations
for ann in aux1_list:
    ann.remove()

plt.pause(0.01) 
plt.show()

Еще один способ сделать это без сохранения аннотации в списке - циклически просмотреть дочерние элементы axes, проверить, являются ли они аннотациями, и удалить, если это так:

for child in plt.gca().get_children():
    if isinstance(child, matplotlib.text.Annotation):
        child.remove()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...