Existe-t-il un moyen de tracer un graphique à barres en matplotlib
utilisant des données directement à partir d'un dict?
Mon dict ressemble à ceci:
D = {u'Label1':26, u'Label2': 17, u'Label3':30}
je m'attendais à
fig = plt.figure(figsize=(5.5,3),dpi=300)
ax = fig.add_subplot(111)
bar = ax.bar(D,range(1,len(D)+1,1),0.5)
travailler, mais ce n’est pas le cas.
Voici l'erreur:
>>> ax.bar(D,range(1,len(D)+1,1),0.5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/site-packages/matplotlib/axes.py", line 4904, in bar
self.add_patch(r)
File "/usr/local/lib/python2.7/site-packages/matplotlib/axes.py", line 1570, in add_patch
self._update_patch_limits(p)
File "/usr/local/lib/python2.7/site-packages/matplotlib/axes.py", line 1588, in _update_patch_limits
xys = patch.get_patch_transform().transform(vertices)
File "/usr/local/lib/python2.7/site-packages/matplotlib/patches.py", line 580, in get_patch_transform
self._update_patch_transform()
File "/usr/local/lib/python2.7/site-packages/matplotlib/patches.py", line 576, in _update_patch_transform
bbox = transforms.Bbox.from_bounds(x, y, width, height)
File "/usr/local/lib/python2.7/site-packages/matplotlib/transforms.py", line 786, in from_bounds
return Bbox.from_extents(x0, y0, x0 + width, y0 + height)
TypeError: coercing to Unicode: need string or buffer, float found
python
matplotlib
plot
Otmezger
la source
la source
ax.bar(D,range(1,len(D)+1,1),0.5)
le premier argument devrait contenir une liste de nombres, dans votre casD.values()
.Réponses:
Vous pouvez le faire en deux lignes en traçant d'abord le graphique à barres, puis en définissant les graduations appropriées:
Notez que l'avant-dernière ligne doit être lue
plt.xticks(range(len(D)), list(D.keys()))
en python3, carD.keys()
renvoie un générateur que matplotlib ne peut pas utiliser directement.la source
ax.set_xticklabels
C'est un peu plus simple que la plupart des réponses ici suggèrent:
la source
Pour référence future, le code ci-dessus ne fonctionne pas avec Python 3. Pour Python 3, le
D.keys()
doit être converti en une liste.la source
La meilleure façon de l'implémenter en utilisant
matplotlib.pyplot.bar(range, height, tick_label)
où la plage fournit des valeurs scalaires pour le positionnement de la barre correspondante dans le graphique.tick_label
fait le même travail quexticks()
. On peut également le remplacer par un entier et utiliser multipleplt.bar(integer, height, tick_label)
. Pour des informations détaillées, veuillez consulter la documentation .De plus, le même graphique peut être généré sans utiliser
range()
. Mais le problème rencontré était que celatick_label
fonctionnait juste pour le dernierplt.bar()
appel. Ainsi axticks()
été utilisé pour l'étiquetage:la source
Je charge souvent le dict dans un DataFrame pandas puis j'utilise la fonction plot du DataFrame.
Voici le one-liner:
la source
Pourquoi pas simplement:
la source