2013-04-15 119 views
42

棒グラフをプロットする方法はありますか?matplotlibを使用して直接データを使用する方法はありますか?python:辞書を使ってmatplotlibを使って棒グラフを作成する

私の辞書には次のようになります。

D = {u'Label1':26, u'Label2': 17, u'Label3':30} 

私は仕事に

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) 

を期待していたが、それはしていません。ここで

は誤りです:

>>> 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 
+0

あなたが動作しないものを具体的に共有できますか?例外はありますか?どのような例外ですか?できるだけ多くの情報を共有してください。 –

+0

@InbarRose申し訳ありませんが、私はそれが表示されるエラーで質問を更新しました...文字列またはバッファに関する何か...私はこのエラーメッセージを理解していません。 – otmezger

+2

あなたが達成したいとは思っていませんが、 'ax.bar(D、range(1、len(D)+1,1)、0.5)'で '最初の引数は、 D.values() ' – adrianp

答えて

81

あなたが最初の棒グラフをプロットし、適切なダニ設定することで、二行でそれを行うことができます:最後から二番目の行が読まなければならないこと

import matplotlib.pyplot as plt 

D = {u'Label1':26, u'Label2': 17, u'Label3':30} 

plt.bar(range(len(D)), list(D.values()), align='center') 
plt.xticks(range(len(D)), list(D.keys())) 
# # for python 2.x: 
# plt.bar(range(len(D)), D.values(), align='center') # python 2.x 
# plt.xticks(range(len(D)), D.keys()) # in python 2.x 

plt.show() 

は注意をD.keys()はgeneratorを返します。これはmatplotlibが直接使用することができないためです。

+2

もちろん、これらの2行を関数にラップして1行になります; – tacaswell

+2

figureオブジェクトとaxesオブジェクトを使用すると、 'ax.set_xticklabels ' – Mark

+1

ありがとう!しかし、plt.xticksに関するいくつかの厄介な問題があります。水平から垂直に移動する方法を教えてください。 – moldovean

21

今後の参考として、上記のコードはPython 3では動作しません。Python 3では、D.keys()をリストに変換する必要があります。

import matplotlib.pyplot as plt 

D = {u'Label1':26, u'Label2': 17, u'Label3':30} 

plt.bar(range(len(D)), D.values(), align='center') 
plt.xticks(range(len(D)), list(D.keys())) 

plt.show() 
0

範囲がグラフに対応するバーの位置決めのためのスカラー値を提供matplotlib.pyplot.bar(range, height, tick_label)を使用して実施するための最良の方法。 tick_labelxticks()と同じ働きをします。整数で置き換えることもでき、複数のplt.bar(integer, height, tick_label)を使用することもできます。詳細については、documentationを参照してください。

import matplotlib.pyplot as plt 

data = {'apple': 67, 'mango': 60, 'lichi': 58} 
names = list(data.keys()) 
values = list(data.values()) 

#tick_label does the some work as plt.xticks() 
plt.bar(range(len(data)),values,tick_label=names) 
plt.savefig('bar.png') 
plt.show() 

enter image description here

さらに同じプロットはrange()を使用せずに生成することができます。しかし、遭遇した問題は、tick_labelが最後のplt.bar()コールのために働いたということでした。したがってxticks()は、標識のために使用された:

data = {'apple': 67, 'mango': 60, 'lichi': 58} 
names = list(data.keys()) 
values = list(data.values()) 
plt.bar(0,values[0],tick_label=names[0]) 
plt.bar(1,values[1],tick_label=names[1]) 
plt.bar(2,values[2],tick_label=names[2]) 
plt.xticks(range(0,3),names) 
plt.savefig('fruit.png') 
plt.show() 

enter image description here

0

私は頻繁にしてデータフレームのプロット機能を使用するパンダのデータフレームの中に辞書を読み込みます。ここ
はワンライナーです:

pandas.DataFrame(D, index=['quantity']).plot(kind='bar') 

resulting plot

関連する問題