从列表中删除重复的mpatches

时间:2016-10-16 22:21:22

标签: python matplotlib

我开始使用我的图中的按钮(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_pa​​tch也会显示两次。因此,我想删除重复项,但这不会起作用。到目前为止我试过了:

list(set(handelist))

还有:

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

但两人都没有工作,我也不明白为什么。希望你有个主意:)

1 个答案:

答案 0 :(得分: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)

编辑:如果你只有1个补丁,你可以做得更简单:

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