我正在嘗試編寫類似於this example的matplotlib錯誤欄圖的傳奇選擇器。我希望能夠點擊圖例中的錯誤條/數據點來切換軸的可見性。問題是由plt.legend()
返回的圖例對象不包含用於創建圖例的藝術家的任何數據。如果我爲例如。這樣做:python matplotlib錯誤條圖例拾取
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
x = np.linspace(0,10,100)
y = np.sin(x) + np.random.rand(100)
yerr = np.random.rand(100)
erbpl1 = ax.errorbar(x, y, yerr=yerr, fmt='o', label='A')
erbpl2 = ax.errorbar(x, 0.02*y, yerr=yerr, fmt='o', label='B')
leg = ax.legend()
從這裏似乎是不可能通過使用leg
對象訪問傳奇的藝術家。通常,可以用簡單的圖例來做到這一點,例如:
plt.plot(x, y, label='whatever')
leg = plt.legend()
proxy_lines = leg.get_lines()
爲您提供圖例中使用的Line2D對象。但是,使用錯誤欄圖表leg.get_lines()
將返回空列表。這種情況很有意義,因爲plt.errorbar
返回一個matplotlib.container.ErrorbarContainer
對象(其中包含數據點,錯誤欄末尾大小寫,錯誤欄行)。我希望圖例有一個類似的數據容器,但我不能看到這一點。我可以管理的最接近的是leg.legendHandles
,它指向錯誤欄行,但不是數據點,也不是結尾帽。如果您可以選擇圖例,則可以使用字典將它們映射到原始圖,並使用以下功能打開/關閉錯誤欄。
def toggle_errorbars(erb_pl):
points, caps, bars = erb_pl
vis = bars[0].get_visible()
for line in caps:
line.set_visible(not vis)
for bar in bars:
bar.set_visible(not vis)
return vis
def onpick(event):
# on the pick event, find the orig line corresponding to the
# legend proxy line, and toggle the visibility
legline = event.artist
origline = lined[legline]
vis = toggle_errorbars(origline)
## Change the alpha on the line in the legend so we can see what lines
## have been toggled
if vis:
legline.set_alpha(.2)
else:
legline.set_alpha(1.)
fig.canvas.draw()
我的問題是,有一種解決方法,可以讓我做採摘活動上errorbar /其他複雜的傳奇?
您使用的是什麼版本的matplotlib?這在我的機器上按預期工作(非常接近當前主機)。 – tacaswell
我使用python 3.2與matplotlib 1.3.0 – astroMonkey
nm,我讀得太快了。要清楚,你在傳奇中獲得了藝術家,但現在正試圖挑選他們。你應該包括證明你的實際問題的代碼,而不僅僅是鍋爐板。 – tacaswell