次のように、凡例が軸の外側にある legend_picking.py の例を変更したときに、興味深い癖に出くわしました。
#leg = ax.legend(loc='upper left', fancybox=True, shadow=True)
leg = ax.legend(loc='upper left', fancybox=True, shadow=True,bbox_to_anchor=(.95,0.95))
凡例でクリックした Line2D アーティストに対して、onpick 関数が 2 回呼び出されてしまいます。これは、伝説の子「木」にセリフが2回あることに関係していると思います。1 つはボックス パッカーの子で、2 番目は凡例の行リストの子です。
私の回避策は、次のように onpick ルーチンを変更することでした。
def onpick(event):
# on the pick event, find the orig line corresponding to the
# legend proxy line, and toggle the visibility
# prevent double pick of same artist all on the same mouseevent
if onpick.lastevent!=event.mouseevent:
onpick.artistsdone=[]
if onpick.lastevent==event.mouseevent and event.artist in onpick.artistsdone:
return
onpick.lastevent=event.mouseevent # save off the mouseevent
onpick.artistsdone.append(event.artist) # mark this artist as serviced
legline = event.artist
origline = lined[legline]
vis = not origline.get_visible()
origline.set_visible(vis)
# Change the alpha on the line in the legend so we can see what lines
# have been toggled
if vis:
legline.set_alpha(1.0)
else:
legline.set_alpha(0.2)
fig.canvas.draw()
onpick.lastevent=None
onpick.artistsdone=[]
私の質問: 誰かがこれを処理するよりエレガントな方法を考えることができますか? 期待した動作が得られない状況を考えてもらえますか?