Ho posto questa domanda perché non ho trovato un esempio funzionante su come annotare i grafici a barre orizzontale raggruppati Pandas. Sono consapevole di quanto segue due:Grafico Panda Bar, come annotare i grafici a barre orizzontali raggruppati
ma sono tutti su grafici a barre verticali. Io, o non ho una soluzione per il grafico a barre orizzontale, o non funziona completamente.
Dopo diverse settimane di lavoro su questo problema, sono finalmente in grado di porre la domanda con un codice di esempio, che è quasi quello che voglio, solo non al 100% di lavoro. Hai bisogno del tuo aiuto per raggiungere quel 100%.
Qui andiamo, full code is uploaded here. Il risultato è simile al seguente:
Si può vedere che è quasi lavorando, proprio l'etichetta non è posto dove voglio e non li può muoversi ad una migliore mettermi. Inoltre, poiché la parte superiore della barra del grafico viene utilizzata per visualizzare la barra di errore, quindi quello che voglio veramente è spostare il testo dell'annotazione verso l'asse y, line up piacevolmente sul lato sinistro o destro dell'asse y, a seconda il valore X. Per esempio, questo è ciò che i miei colleghi possono fare con MS Excel:
Questo è possibile per Python per farlo con grafico Panda?
sto compreso il codice dal mio sopra URL per l'annotazione, uno è il mio tutto-che-mi-can-do, e l'altro è per il riferimento (da In [23]
):
# my all-that-I-can-do
def autolabel(rects):
#if height constant: hbars, vbars otherwise
if (np.diff([plt.getp(item, 'width') for item in rects])==0).all():
x_pos = [rect.get_x() + rect.get_width()/2. for rect in rects]
y_pos = [rect.get_y() + 1.05*rect.get_height() for rect in rects]
scores = [plt.getp(item, 'height') for item in rects]
else:
x_pos = [rect.get_width()+.3 for rect in rects]
y_pos = [rect.get_y()+.3*rect.get_height() for rect in rects]
scores = [plt.getp(item, 'width') for item in rects]
# attach some text labels
for rect, x, y, s in zip(rects, x_pos, y_pos, scores):
ax.text(x,
y,
#'%s'%s,
str(round(s, 2)*100)+'%',
ha='center', va='bottom')
# for the reference
ax.bar(1. + np.arange(len(xv)), xv, align='center')
# Annotate with text
ax.set_xticks(1. + np.arange(len(xv)))
for i, val in enumerate(xv):
ax.text(i+1, val/2, str(round(val, 2)*100)+'%', va='center',
ha='center', color='black')
Per favore aiuto. Grazie.
@xpt, ok, fatemi sapere se non si capisce qualcosa. Ho apportato alcune modifiche da quando hai commentato. – jrjc
eccellente, eccellente! Scusa per aver risposto in ritardo. L'unica domanda che ho è, dall'intero codice non ho visto perché è necessario "importare seaborn", ma quando ho commentato quella riga, funziona ancora, ma il grafico sembra più brutto. Immagino che risponda alla domanda, ma perché è così? Di nuovo. – xpt
@xpt, sì, vedere la riga 5 ('sns.set_style ...'), ho commentato che era per scopi estetici. – jrjc