gpt4 book ai didi

python - 在多个 matplotlib.pyplot 子图上创建图例单击事件

转载 作者:行者123 更新时间:2023-12-01 00:55:38 24 4
gpt4 key购买 nike

我有几个 matplolib.pyplot 图形。每个都有一个图例,我想要的是单击图例上的线隐藏图中的线。点击事件处理在这里找到:https://matplotlib.org/examples/event_handling/legend_picking.html

当只有一个图形时,此方法效果很好,但当有多个图形时,它仅适用于最后一个图形。当我单击另一个人物的图例时,我没有收到任何异常或警告,但什么也没有发生。

以下是解决此问题的示例代码:

import matplotlib.pyplot as plt
import numpy as np

a = np.arange(0,10,1)
b = np.arange(0,20,2)
c = np.arange(0,5,.5)
d = np.arange(-1,9,1)

lined = {}

for var1, var2 in [(a,b), (c,d)]:
fig, ax = plt.subplots()
line1, = ax.plot(var1, label="l1")
line2, = ax.plot(var2, label="l2")
leg = fig.legend([line1, line2], ["l1", "l2"])
legl1, legl2 = leg.get_lines()
legl1.set_picker(5)
lined[legl1] = line1
legl2.set_picker(5)
lined[legl2] = line2

def onpick(event, figu):
legl = event.artist
origl = lined[legl]
vis = not origl.get_visible()
origl.set_visible(vis)
if vis:
legl.set_alpha(1.0)
else:
legl.set_alpha(0.2)
figu.canvas.draw()

fig.canvas.mpl_connect('pick_event', lambda ev: onpick(ev, fig))
plt.show()

如何使点击事件也适用于第一个图形?

最佳答案

原因由 https://docs.python-guide.org/writing/gotchas/#late-binding-closures 给出。我必须承认我自己并不完全理解它,但它给出了解决它的技巧:使用默认参数。

import matplotlib.pyplot as plt
import numpy as np

a = np.arange(0,10,1)
b = np.arange(0,20,2)
c = np.arange(0,5,.5)
d = np.arange(-1,9,1)

lined = {}

for var1, var2 in [(a,b), (c,d)]:
fig, ax = plt.subplots()
line1, = ax.plot(var1, label="l1")
line2, = ax.plot(var2, label="l2")
leg = fig.legend([line1, line2], ["l1", "l2"])
legl1, legl2 = leg.get_lines()
legl1.set_picker(5)
lined[legl1] = line1
legl2.set_picker(5)
lined[legl2] = line2

def onpick(event, figu=fig):
legl = event.artist
origl = lined[legl]
vis = not origl.get_visible()
origl.set_visible(vis)
if vis:
legl.set_alpha(1.0)
else:
legl.set_alpha(0.2)
figu.canvas.draw()

fig.canvas.mpl_connect('pick_event', onpick) # no need for a lambda
plt.show()

如前所述,该解决方案有点hacky。比较看似相同的内容

# works
def onpick(event, figu=fig):
(...)
figu.canvas.draw() # using a default arg equal to fig
fig.canvas.mpl_connect('pick_event', onpick)

对比

# fails as described
def onpick(event):
(...)
fig.canvas.draw() # using fig from main loop directly
fig.canvas.mpl_connect('pick_event', onpick)

关于python - 在多个 matplotlib.pyplot 子图上创建图例单击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56270451/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com