사전을 사용하여 matplotlib를 사용하여 막대 플로팅


95

matplotlibdict에서 직접 데이터를 사용 하여 막대 그림을 그리는 방법이 있습니까?

내 사전은 다음과 같습니다.

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

작동하지 않는 것을 구체적으로 공유 할 수 있습니까? 예외가 있습니까? 무슨 예외? 가능한 한 많은 정보를 공유하십시오.
Inbar 로즈

@InbarRose 죄송합니다. 오류 메시지로 질문을 업데이트했습니다 ... 문자열 또는 버퍼와 관련된 문제 ...이 오류 메시지를 이해할 수 없습니다.
otmezger

2
달성하고자하는 것이 무엇인지는 명확하지 않지만 ax.bar(D,range(1,len(D)+1,1),0.5)첫 번째 인수에는 숫자 목록이 있어야합니다 D.values().
adrianp 2013-04-15

2
적어도 내 지식으로는 이것에 대해 한 줄짜리가 불가능합니다.
adrianp

1
유용 해 보이기 때문에이를 위해 github 사이트에 기능 요청을 제출할 수 있습니다.
tacaswell 2013

답변:


161

먼저 막대 차트를 플로팅 한 다음 적절한 눈금을 설정하여 두 줄로 할 수 있습니다.

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

두 번째 줄은 matplotlib가 직접 사용할 수없는 생성기를 반환 plt.xticks(range(len(D)), list(D.keys()))하기 때문에 python3에서 읽어야 D.keys()합니다.


2
), 당신은 물론 함수에 두 줄을 마무리 할 수 있으며 다음은 한 줄이된다
tacaswell

2
Figure 및 좌표축 객체를 사용하는 경우ax.set_xticklabels
Mark

2
감사! 그러나 나는 plt.xticks에 대한 미학적 문제가 있습니다. 수평에서 수직으로 이동하는 방법을 알려주세요.
Moldovean 2014 년

2
dict가 정렬되지 않은 경우 키-값 쌍이 정렬됩니까?
ssm

2
Python 사전은 정렬 할 수 없습니다. 결과적으로 순서는 항상 임의적입니다. 그러나 키와 값은 항상 위의 코드와 일치합니다.
David Zwicker

41

여기에서 제안하는 대부분의 답변보다 조금 더 간단합니다.

import matplotlib.pyplot as plt

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

여기에 이미지 설명 입력


35

나중에 참조 할 수 있도록 위 코드는 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()

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

나는 종종 dict를 pandas DataFrame에로드 한 다음 DataFrame의 플롯 기능을 사용합니다.
다음은 한 줄짜리입니다.

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

결과 플롯


4

왜 안 되는가 :

import seaborn as sns

sns.barplot(list(D.keys()), list(D.values()))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.