พล็อตแถบโดยใช้ matplotlib โดยใช้พจนานุกรม


96

มีวิธีใดในการวางพล็อตแท่งโดยmatplotlibใช้ข้อมูลโดยตรงจาก dict

คำสั่งของฉันมีลักษณะดังนี้:

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 Rose

@InbarRose ขออภัยฉันได้อัปเดตคำถามด้วยข้อผิดพลาดที่แสดง ... บางอย่างเกี่ยวกับสตริงหรือบัฟเฟอร์ ... ฉันไม่เข้าใจข้อความแสดงข้อผิดพลาดนี้
otmezger

2
มันไม่ชัดเจนสิ่งที่คุณต้องการที่จะประสบความสำเร็จ แต่ในอาร์กิวเมนต์แรกควรจะเป็นรายการของตัวเลขในกรณีของคุณax.bar(D,range(1,len(D)+1,1),0.5) D.values()
adrianp

2
สิ่งนี้เป็นไปไม่ได้อย่างน้อยก็เพื่อความรู้ของฉัน
adrianp

1
คุณอาจต้องการส่งคำขอคุณลักษณะไปยังไซต์ github สำหรับสิ่งนี้เนื่องจากดูเหมือนว่ามีประโยชน์
tacaswell

คำตอบ:


162

คุณสามารถทำได้ในสองบรรทัดโดยการพล็อตแผนภูมิแท่งก่อนจากนั้นตั้งค่าเห็บที่เหมาะสม:

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

โปรดทราบว่าบรรทัดสุดท้ายควรอ่านplt.xticks(range(len(D)), list(D.keys()))ใน python3 เนื่องจากD.keys()ส่งคืนตัวสร้างซึ่ง matplotlib ไม่สามารถใช้โดยตรง


2
แน่นอนคุณสามารถรวมสองบรรทัดนี้เข้าด้วยกันในฟังก์ชันจากนั้นมันจะกลายเป็นซับเดียว;)
tacaswell

2
ถ้าคุณใช้วัตถุรูปและแกนก็คือax.set_xticklabels
มาระโก

2
ขอบคุณ! แต่ฉันมีปัญหาเกี่ยวกับความงามของ plt.xticks คุณช่วยบอกเราได้ไหมว่าจะย้ายพวกมันในแนวตั้งจากแนวนอนได้อย่างไร
moldovean

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 ลงใน DataFrame แพนด้าจากนั้นใช้ฟังก์ชันพล็อตของ DataFrame
นี่คือซับเดียว:

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

พล็อตผลลัพธ์


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.