我必須在一個繪圖中繪製幾個數據集。能夠突出顯示一個或多個圖表以便比較它們非常有用。爲此,無論何時直接選擇一條線,或通過單擊圖例中的相應條目,我都會在":"
(背景圖)和"-"
(高亮顯示的圖)之間切換圖的線型。如果圖例不在座標軸上,鼠標點擊就會註冊雙擊事件
這個工作完美,直到我嘗試使用bbox_to_anchor
移動軸外的圖例。在此之後,只需點擊圖例行上的一個鼠標就會連續觸發2個點擊事件,從而取消切換效果。
如何在保持pick_event的正確行爲的同時將圖例置於軸外?
重現問題的簡化代碼(單擊一條繪圖線在「高亮顯示」和「未高亮顯示」之間切換,而單擊圖例線在返回之前狀態之前短暫切換繪圖線):
import pylab
import numpy
# Create data for plotting
t = numpy.linspace(0, 1.0, 100)
a = numpy.sin(2*numpy.pi*t)
# Set up figure
fig = pylab.figure()
ax = pylab.subplot(111)
# Plot figures
lines = []
for i in range(5):
line = ax.plot(t, (i+1)*a, linestyle=':', picker=5, label='line%d'%(i+1))
lines.append(line[0]) # Save plot lines
# Create legend
leg = ax.legend(bbox_to_anchor=(1.01, 1), loc=2) # Does not work as expected
# leg = ax.legend() # Works!!
# Get legend lines
leglines = leg.get_lines()
# Set event for legend lines
for line in leglines:
line.set_picker(5)
# Create a 2 way mapping between legend lines <-> plot lines
line2leg = dict(zip(lines+leglines, leglines+lines))
# Define event function
def onpick(event):
thisline = event.artist
if thisline.get_linestyle()==':':
print ": -> -" # For debugging
thisline.set_linestyle('-')
line2leg[thisline].set_linestyle('-')
else:
print "- -> :" # For debugging
thisline.set_linestyle(':')
line2leg[thisline].set_linestyle(':')
fig.canvas.draw()
# connect event function
fig.canvas.mpl_connect('pick_event', onpick)
pylab.show()
這很好奇。它看起來像是同一個選擇事件被處理了兩次,而不是它產生了兩個事件,這讓我認爲這是一個錯誤 – tacaswell 2013-04-29 14:49:19
@tcaswell如何判斷它是否是同一個選擇事件,或者是否是同一類型的事件事件產生? – Dhara 2013-04-29 15:06:57
如果您向'onpick'添加'print event'行,它們在打印時具有相同的內存地址 – tacaswell 2013-04-29 15:23:07