python matplotlib

python - Cómo anotar los valores de X e Y al pasar el mouse sobre el gráfico de barras



matplotlib (1)

He intentado hacerlo, pero durante la ejecución, me muestra el siguiente error:

bar,=plt.bar(xpos,revenue)

ValueError: demasiados valores para descomprimir

¿Cómo puedo resolverlo ya que quiero valores de x e y en la anotación mientras se pasa 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. Por lo tanto, debe eliminar la coma ( , ). En su lugar, llame al contenedor de barras devuelto algo así como bars = plt.bar(xpos,revenue) .

Tampoco puede copiar a ciegas alguna otra solución para dispersiones o parcelas para barras. En su lugar, debe adaptarlo a las barras. Por lo tanto, debe pasar por las barras y verificar cuál de ellas, si la hay, 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()