我开始使用我的图中的按钮(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)
但两人都没有工作,我也不明白为什么。希望你有个主意:)
答案 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)