Existe alguma maneira de plotar um gráfico de barra matplotlib
usando dados diretamente de um dicionário?
Meu dict se parece com este:
D = {u'Label1':26, u'Label2': 17, u'Label3':30}
eu estava esperando
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)
funcionar, mas não funciona.
Aqui está o erro:
>>> 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
fonte
fonte
ax.bar(D,range(1,len(D)+1,1),0.5)
primeiro argumento deve haver uma lista de números, no seu casoD.values()
.Respostas:
Você pode fazer isso em duas linhas, primeiro plotando o gráfico de barras e, em seguida, definindo os tiques apropriados:
Observe que a penúltima linha deve ser lida
plt.xticks(range(len(D)), list(D.keys()))
em python3, porqueD.keys()
retorna um gerador, que matplotlib não pode usar diretamente.fonte
ax.set_xticklabels
É um pouco mais simples do que a maioria das respostas aqui sugere:
fonte
Para referência futura, o código acima não funciona com Python 3. Para Python 3, o
D.keys()
precisa ser convertido em uma lista.fonte
A melhor forma de implementá-lo é
matplotlib.pyplot.bar(range, height, tick_label)
onde o intervalo fornece valores escalares para o posicionamento da barra correspondente no gráfico.tick_label
faz o mesmo trabalho quexticks()
. Também se pode substituí-lo por um inteiro e usar váriosplt.bar(integer, height, tick_label)
. Para obter informações detalhadas, consulte a documentação .Além disso, o mesmo gráfico pode ser gerado sem o uso
range()
. Mas o problema encontrado foi quetick_label
funcionou apenas para a últimaplt.bar()
chamada. Portanto,xticks()
foi usado para rotulagem:fonte
Costumo carregar o dicionário em um DataFrame do pandas e, em seguida, usar a função plot do DataFrame.
Aqui está o one-liner:
fonte
Por que não apenas:
fonte