Je suis resté coincé sur quelque chose qui devrait être relativement facile. Le code que j'apporte ci-dessous est un exemple basé sur un projet plus vaste sur lequel je travaille. Je n'ai vu aucune raison de publier tous les détails, veuillez donc accepter les structures de données que j'apporte telles quelles.
Fondamentalement, je crée un graphique à barres et je peux simplement comprendre comment ajouter des étiquettes de valeur sur les barres (au centre de la barre, ou juste au-dessus). J'ai regardé des exemples sur le Web, mais sans succès l'implémentation sur mon propre code. Je pense que la solution est soit avec «texte» ou «annoter», mais je: a) ne sais pas lequel utiliser (et de manière générale, je n'ai pas compris quand utiliser lequel). b) ne peut pas voir pour obtenir non plus de présenter les étiquettes de valeur. J'apprécierais votre aide, mon code ci-dessous. Merci d'avance!
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
pd.set_option('display.mpl_style', 'default')
%matplotlib inline
# Bring some raw data.
frequencies = [6, 16, 75, 160, 244, 260, 145, 73, 16, 4, 1]
# In my original code I create a series and run on that,
# so for consistency I create a series from the list.
freq_series = pd.Series.from_array(frequencies)
x_labels = [108300.0, 110540.0, 112780.0, 115020.0, 117260.0, 119500.0,
121740.0, 123980.0, 126220.0, 128460.0, 130700.0]
# Plot the figure.
plt.figure(figsize=(12, 8))
fig = freq_series.plot(kind='bar')
fig.set_title('Amount Frequency')
fig.set_xlabel('Amount ($)')
fig.set_ylabel('Frequency')
fig.set_xticklabels(x_labels)
Réponses:
Tout d'abord,
freq_series.plot
retourne un axe et non un chiffre, donc pour rendre ma réponse un peu plus claire, j'ai changé votre code donné pour y faire référenceax
plutôt quefig
pour être plus cohérent avec d'autres exemples de code.Vous pouvez obtenir la liste des barres produites dans le tracé auprès du
ax.patches
membre. Ensuite, vous pouvez utiliser la technique illustrée dans cetmatplotlib
exemple de galerie pour ajouter les étiquettes à l'aide de laax.text
méthode.Cela produit un tracé étiqueté qui ressemble à:
la source
text
imprime simplement du texte sur le tracé, tandis queannotate
c'est une aide que vous pouvez utiliser pour ajouter facilement une flèche à partir du texte pointant vers un point spécifique du tracé auquel le texte fait référence.Sur la base d'une fonctionnalité mentionnée dans cette réponse à une autre question, j'ai trouvé une solution très généralement applicable pour placer des étiquettes sur un graphique à barres.
D'autres solutions ne fonctionnent malheureusement pas dans de nombreux cas, car l'espacement entre l'étiquette et la barre est soit donné en unités absolues des barres, soit mis à l'échelle par la hauteur de la barre . Le premier ne fonctionne que pour une plage étroite de valeurs et le second donne un espacement incohérent dans un graphique. Ni l'un ni l'autre ne fonctionne bien avec les axes logarithmiques.
La solution que je propose fonctionne indépendamment de l'échelle (ie pour les petits et grands nombres) et place même correctement les étiquettes pour les valeurs négatives et avec des échelles logarithmiques car elle utilise l'unité visuelle
points
pour les décalages.J'ai ajouté un nombre négatif pour montrer le placement correct des étiquettes dans un tel cas.
La valeur de la hauteur de chaque barre est utilisée comme étiquette pour celle-ci. D'autres étiquettes peuvent facilement être utilisées avec l'
for rect, label in zip(rects, labels)
extrait de Simon .Edit: J'ai extrait la fonctionnalité pertinente dans une fonction, comme suggéré par barnhillec .
Cela produit la sortie suivante:
Et avec l'échelle logarithmique (et quelques ajustements aux données d'entrée pour présenter la mise à l'échelle logarithmique), voici le résultat:
la source
En nous basant sur la (excellente!) Réponse ci-dessus, nous pouvons également créer un graphique à barres horizontales avec juste quelques ajustements:
la source
freq_series.plot(kind='barh', grid=True)
Si vous souhaitez simplement étiqueter les points de données au-dessus de la barre, vous pouvez utiliser plt.annotate ()
Mon code:
Eh bien, le texte avec plusieurs caractères peut être affiché légèrement décentré. Mais cela peut être surmonté en diminuant légèrement la coordonnée x dans le paramètre xy en fonction de la taille du texte
la source
Si vous souhaitez uniquement ajouter des points de données au-dessus des barres, vous pouvez facilement le faire avec:
la source