Cómo anotar los valores de X e Y mientras se desplaza el mouse sobre el gráfico de barras

He intentado hacerlo pero al ejecutarlo, me muestra el siguiente error:

bar,=plt.bar(xpos,revenue) 

ValueError: demasiados valores para descomprimir

¿Cómo puedo resolverlo? Quiero valores de x e y en la anotación mientras muevo el mouse. Este es mi siguiente código:

 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)) bar,=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(ind): x,y = bar.get_data() x0 = x[ind["ind"][0]] y0 = y[ind["ind"][0]] annot.xy = (x0, y0) text = "({:.2g},{:.2g})".format( x0,y0, ) annot.set_text(text) annot.get_bbox_patch().set_alpha(0.4) def hover(event): vis = annot.get_visible() if event.inaxes == ax: cont, ind = bar.contains(event) if cont: update_annot(ind) annot.set_visible(True) fig.canvas.draw_idle() else: if vis: annot.set_visible(False) fig.canvas.draw_idle() fig.canvas.mpl_connect("motion_notify_event", hover) plt.show() 

El error le dice que plt.bar devuelve un solo objeto, que no se puede desempaquetar. Así que necesitas quitar la coma ( , ). En su lugar, llame al contenedor de barras devuelto algo como bars = plt.bar(xpos,revenue) .

Tampoco puede copiar ciegamente alguna otra solución para dispersión o gráficos para barras. En su lugar hay que adaptarlo a las barras. Por lo tanto, debe pasar por las barras y comprobar cuál de ellas, si existe, está suspendida.

Vea una solución completa aquí:

 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()