2016-03-09 124 views
4

我有一个非常简单的堆放在PyQt Canvas中的matplotlib条形图。我正在尝试根据点击获得条形区域(矩形)的相应标签。但是当我尝试打印来自事件的信息时,我总是会得到_nolegend_。理想情况下,我希望看到代码中附带的条上的相应标签。如何获得matplotlib中条形图/堆积条形图上的标签?

例如,当您单击灰色栏应该打印A2

import sys 
import matplotlib.pyplot as plt 

from PyQt4 import QtGui 
from matplotlib.figure import Figure 
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas 


def on_pick(event): 
    print event.artist.get_label() 

def main(): 

    app = QtGui.QApplication(sys.argv) 

    w = QtGui.QWidget() 
    w.resize(640, 480) 
    w.setWindowTitle('Pick Test') 

    fig = Figure((10.0, 5.0), dpi=100) 
    canvas = FigureCanvas(fig) 
    canvas.setParent(w) 

    axes = fig.add_subplot(111) 

    # bind the pick event for canvas 
    fig.canvas.mpl_connect('pick_event', on_pick) 

    p1 = axes.bar(1,6,picker=2,label='a1') 
    p2 = axes.bar(1,2, bottom=6,color='gray',picker=1,label='a2') 

    axes.set_ylim(0,10) 
    axes.set_xlim(0,5) 

    w.show() 

    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 

Simple stacked bar plot

回答

2

这变得有点棘手,因为bar是真正由多个的情节复杂对象组件。

您可以使用get_legend_handles_labels获取所有轴的艺术家和标签。然后你可以看看你的当前艺术家属于哪个组。

所以你的回调可能看起来像这样。

def on_pick(event) 
    rect = event.artist 

    # Get the artists and the labels 
    handles,labels = rect.axes.get_legend_handles_labels() 

    # Search for your current artist within all plot groups 
    label = [label for h,label in zip(handles, labels) if rect in h.get_children()] 

    # Should only be one entry but just double check 
    if len(label) == 1: 
     label = label[0] 
    else: 
     label = None 

    print label 
+0

Thanks @Suever,that worked。你是对的,与通过获取_event.artist.get_label()_值直接工作的堆积区域图相比,它非常复杂。 – narenandu