2016-10-16 4 views
0

Я начинаю работать с кнопками на своих участках (from matplotlib.widgets import Button). Нажимая кнопки, появятся разные графики. По этой причине мои легенды меняются. Я с этим справиться, поставив mpatches в списке:Удаление дубликатов сообщений из списка

red_patch = mpatches.Patch(color='red', label='Numerical average') 
handlelist.append(red_patch) 
ax.legend(handles=handlelist, numpoints=1) 

Теперь, если нажать на ту же кнопку дважды, red_patch также будет отображаться в два раза. Из-за этого я хочу удалить дубликаты, но это не сработает. До сих пор я пытался:

list(set(handelist)) 

, а также:

if red_patch not in handelist: 
    handlelist.append(red_patch) 

Но и не будет работать, и я не понимаю, почему. Надеюсь, что у вас есть идея :)

ответ

1

Проблема заключается в том, что:

red_patch = mpatches.Patch(color='red', label='Numerical average') 

создает экземпляр red_patch каждый раз. Оператор __eq__, по-видимому, не реализован для этого конкретного типа, поэтому set сравнивает ссылки на объекты, которые не равны.

Я хотел бы предложить следующий код вместо:

# declare as ordered dict (so order of creation matters), not list 
import collections 
handlelist = collections.OrderedDict() 

color = 'red' 
label = 'Numerical average' 

if (color,label) not in handlelist: 
    handlelist[(color,label)] = mpatches.Patch(color=color, label=label) 

# pass the values of the dict as list (legend expects a list) 
ax.legend(handles=list(handlelist.values()), numpoints=1) 

Ключ словаря является пара (color,label) и при вызове метода legend только вы не получите один red_patch, потому что, если запись уже существует, никаких дополнительных Patch будет создан.

Конечно, вы должны сделать то же самое в других частях вашего кода, где вы обновляете handlelist. Общий метод будет удобно:

def create_patch(color,label): 
    if (color,label) not in handlelist: 
     handlelist[(color,label)] = mpatches.Patch(color=color, label=label) 

EDIT: если у вас есть только 1 общей патч, вы могли бы сделать еще проще:

p = mpatches.Patch(color='red', label='Numerical average') 
ax.legend([p], numpoints=1) 
+0

Спасибо за вашу помощь! Я пробовал ваш код, но в тот момент, когда я получаю сообщение об ошибке: 'RCD8.py ', строка 141, в ax.legend (handles = handlelist.values ​​(), numpoints = 1) Файл" anaconda/lib/python3 .5/site-packages/matplotlib/axes/_axes.py ", строка 502, в легенде для метки, дескриптор в zip (метки [:], handle [:]): ТипError: объект dict_values ​​не подлежит индексированию ' – HighwayJohn

+0

ooops, я перешел в' list', теперь он должен быть индексируемым. Также изменил dict как 'OrderedDict' только в том случае, если порядок создания имеет значение. –

+0

Спасибо, что сейчас работает! Только одна новая проблема. У меня есть один сброс кнопка, которая в основном сбрасывает список. С моим прежним кодом 'del handlelist [:]' выполнил задание. Теперь я получаю сообщение об ошибке. Что мне нужно здесь изменить? – HighwayJohn

Смежные вопросы