辞書を使用してmatplotlibを使用してバーをプロットする


92

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

うまくいかないことを具体的に教えてください。例外はありますか?どんな例外?できるだけ多くの情報を共有します。
インバーローズ2013

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

2
何を達成したいのかは明確ではありませんがax.bar(D,range(1,len(D)+1,1),0.5)、最初の引数には数値のリストを指定する必要がありますD.values()
adrianp 2013

2
少なくとも私の知る限り、これにはワンライナーは不可能です。
adrianp 2013

1
この機能は便利に思えるので、githubサイトに機能リクエストを送信することをお勧めします。
tacaswell 2013

回答:


154

最初に棒グラフをプロットしてから適切な目盛りを設定することで、2行でそれを行うことができます。

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()

最後から2番目の行はplt.xticks(range(len(D)), list(D.keys()))python3で読み取る必要D.keys()があります。これは、matplotlibが直接使用できないジェネレーターを返すためです。


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

2
FigureおよびAxesオブジェクトを使用する場合、それはax.set_xticklabels
マーク

2
ありがとう!しかし、plt.xticksにはいくつかの問題があります。水平から垂直に移動する方法を教えてください。
モルドベアン2014年

2
辞書がソートされていない場合、キーと値のペアは整列していますか?
ssm 2015年

2
Python辞書はソートできません。したがって、順序は常に任意です。ただし、キーと値は常に上記のコードに合わせて調整されます。
David Zwicker

36

ここでのほとんどの回答が示唆するよりも少し単純です:

import matplotlib.pyplot as plt

D = {u'Label1':26, u'Label2': 17, u'Label3':30}
plt.bar(*zip(*D.items()))
plt.show()

ここに画像の説明を入力してください


34

将来の参考のために、上記のコードはPython 3では機能しません。Python3の場合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()

8

matplotlib.pyplot.bar(range, height, tick_label)範囲がグラフ内の対応するバーの配置にスカラー値を提供する場所を使用してそれを実装する最良の方法。tick_labelと同じ働きをしxticks()ます。それを整数に置き換えて、複数を使用することもできますplt.bar(integer, height, tick_label)。詳細については、ドキュメントを参照してください。

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()

ここに画像の説明を入力してください

さらに、を使用せずに同じプロットを生成できます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()

ここに画像の説明を入力してください


4

私はよくdictsをpandas DataFrameにロードしてから、DataFrameのplot関数を使用します。
これがワンライナーです:

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

結果のプロット


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.