How to annotate the values of X and Y while hovering mouse over the bar graph

前端 未结 1 482
终归单人心
终归单人心 2020-12-02 01:33

I have tried to make it but while executing, it shows me the following error:

bar,=plt.bar(xpos,revenue)

ValueError: too man

相关标签:
1条回答
  • 2020-12-02 02:07

    The error tells you that plt.bar returns a single object, which cannot be unpacked. So you need to remove the comma (,). Instead call the returned bar container something like bars = plt.bar(xpos,revenue).

    You also cannot blindly copy some other solution for scatters or plots for bars. Instead you need to adapt it to the bars. So you need to go through the bars and check which of them, if any, is hovered.

    See a complete solution here:

    import numpy as np
    import matplotlib.pyplot as plt
    
    company=['google','amazon','msft','fb']
    revenue=[80,68,54,27]
    
    fig=plt.figure()
    ax=plt.subplot()
    
    xpos=np.arange(len(company))
    
    bars = plt.bar(xpos,revenue)
    
    
    annot = ax.annotate("", xy=(0,0), xytext=(-20,20),textcoords="offset points",
                        bbox=dict(boxstyle="round", fc="black", ec="b", lw=2),
                        arrowprops=dict(arrowstyle="->"))
    annot.set_visible(False)
    
    def update_annot(bar):
        x = bar.get_x()+bar.get_width()/2.
        y = bar.get_y()+bar.get_height()
        annot.xy = (x,y)
        text = "({:.2g},{:.2g})".format( x,y )
        annot.set_text(text)
        annot.get_bbox_patch().set_alpha(0.4)
    
    
    def hover(event):
        vis = annot.get_visible()
        if event.inaxes == ax:
            for bar in bars:
                cont, ind = bar.contains(event)
                if cont:
                    update_annot(bar)
                    annot.set_visible(True)
                    fig.canvas.draw_idle()
                    return
        if vis:
            annot.set_visible(False)
            fig.canvas.draw_idle()
    
    fig.canvas.mpl_connect("motion_notify_event", hover)
    
    plt.show()
    
    0 讨论(0)
提交回复
热议问题