J'ai généré un graphique à barres, comment puis-je afficher la valeur de la barre sur chaque barre?
Graphique actuel:
Ce que j'essaye d'obtenir:
Mon code:
import os
import numpy as np
import matplotlib.pyplot as plt
x = [u'INFO', u'CUISINE', u'TYPE_OF_PLACE', u'DRINK', u'PLACE', u'MEAL_TIME', u'DISH', u'NEIGHBOURHOOD']
y = [160, 167, 137, 18, 120, 36, 155, 130]
fig, ax = plt.subplots()
width = 0.75 # the width of the bars
ind = np.arange(len(y)) # the x locations for the groups
ax.barh(ind, y, width, color="blue")
ax.set_yticks(ind+width/2)
ax.set_yticklabels(x, minor=False)
plt.title('title')
plt.xlabel('x')
plt.ylabel('y')
#plt.show()
plt.savefig(os.path.join('test.png'), dpi=300, format='png', bbox_inches='tight') # use format='svg' or 'pdf' for vectorial pictures
python
matplotlib
bar-chart
Franck Dernoncourt
la source
la source
plt.text(v, i, " "+str(v), color='blue', va='center', fontweight='bold')
plt.show()
clause à la fin. Par exemple:df.plot(); plt.show()
J'ai remarqué que l' exemple de code api contient un exemple de graphique à barres avec la valeur de la barre affichée sur chaque barre:
production:
FYI Quelle est l'unité de hauteur variable en "barh" de matplotlib? (à partir de maintenant, il n'y a pas de moyen facile de définir une hauteur fixe pour chaque barre)
la source
Pour tous ceux qui souhaitent avoir leur étiquette à la base de leurs barres, divisez simplement v par la valeur de l'étiquette comme ceci:
(note: j'ai ajouté 100 donc ce n'était pas absolument en bas)
Pour obtenir un résultat comme celui-ci:
la source
v == labels[i]
et ainsi la troisième et la quatrième ligne pourraient simplement être101, v
?Je sais que c'est un vieux fil de discussion, mais j'ai atterri ici plusieurs fois via Google et je pense qu'aucune réponse n'est encore vraiment satisfaisante. Essayez d'utiliser l'une des fonctions suivantes:
EDIT : Au fur et à mesure que j'obtiens des likes sur cet ancien fil, je veux également partager une solution mise à jour (en gros, rassembler mes deux fonctions précédentes et décider automatiquement s'il s'agit d'un tracé à barres ou hbar):
Vous pouvez maintenant les utiliser pour les graphiques à barres normaux:
ou pour les graphiques à barres horizontales:
la source
Utilisez plt.text () pour mettre du texte dans le tracé.
Exemple:
Cela montrera la figure comme:
graphique à barres avec des valeurs en haut
la source
plt.text(x=index , y =data+1 , s=f"{data}" , fontdict=dict(fontsize=20), va='center')
Pour les pandas:
C'est tout. Alternativement, pour ceux qui préfèrent
apply
le bouclage avec enumerate:En outre,
ax.patches
vous donnera les barres avec lesquelles vous obtiendrezax.bar(...)
. Au cas où vous voudriez appliquer les fonctions de @SaturnFromTitan ou des techniques d'autres.la source
[ax.text(i, v, '{:.2f}%'.format(100*v)) for i, v in enumerate(s)];
for p in ax.patches: ax.annotate(str(p.get_height()), (p.get_x() * 1.005, p.get_height() * 1.005))
J'avais également besoin des étiquettes de barre, notez que mon axe y a une vue agrandie en utilisant des limites sur l'axe y. Les calculs par défaut pour placer les étiquettes au-dessus de la barre fonctionnent toujours en utilisant la hauteur (use_global_coordinate = False dans l'exemple). Mais je voulais montrer que les étiquettes peuvent également être placées en bas du graphique en vue agrandie en utilisant les coordonnées globales dans matplotlib 3.0.2 . J'espère que cela aidera quelqu'un.
la source
J'essayais de faire cela avec des barres de tracé empilées. Le code qui a fonctionné pour moi était.
la source
Vérifiez ce lien Galerie Matplotlib Voici comment j'ai utilisé l'extrait de code de l'autolabel.
la source