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