एक शब्दकोश का उपयोग कर 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

क्या आप विशेष रूप से साझा कर सकते हैं जो काम नहीं करता है? क्या आपको एक अपवाद मिलता है? क्या अपवाद है? ज्यादा से ज्यादा जानकारी शेयर करें।
इबर रोज

@ InbarRose माफ़ कीजिए, मैंने प्रश्न को उस त्रुटि से अपडेट किया है जो दिखाता है ... स्ट्रिंग या बफर से संबंधित कुछ ... मुझे यह त्रुटि संदेश समझ नहीं आया।
otmezger

2
यह स्पष्ट नहीं है कि आप क्या हासिल करना चाहते हैं, लेकिन ax.bar(D,range(1,len(D)+1,1),0.5)पहले तर्क में आपके मामले में संख्याओं की एक सूची होनी चाहिए D.values()
एड्रियनप

2
एक लाइनर इसके लिए संभव नहीं है, कम से कम मेरी जानकारी के लिए।
एड्रियनप

1
आप इसके लिए github साइट पर एक सुविधा अनुरोध सबमिट करना चाह सकते हैं, क्योंकि यह उपयोगी लगता है।
tacaswell

जवाबों:


154

बार चार्ट को पहले प्लॉट करके और फिर उपयुक्त टिक सेट करके आप इसे दो लाइनों में कर सकते हैं:

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 के साथ कुछ एस्थेटिक मुद्दे हैं, क्या आप हमें बता सकते हैं कि उन्हें क्षैतिज रूप से लंबवत कैसे स्थानांतरित किया जाए।
मोलडोवियन

2
जब कुंजी को क्रमबद्ध नहीं किया जाता है, तो कुंजी-मूल्य जोड़े जोड़े जाते हैं?
एसआर

2
पायथन डाइक को छांटा नहीं जा सकता। नतीजतन, आदेश हमेशा मनमाना होता है। हालाँकि, कुंजी और मान हमेशा उपरोक्त कोड के साथ संरेखित होते हैं।
डेविड ज़्विकर

36

यहाँ सुझाए गए अधिकांश उत्तरों की तुलना में यह थोड़ा सरल है:

import matplotlib.pyplot as plt

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

यहां छवि विवरण दर्ज करें


34

भविष्य के संदर्भ के लिए, उपरोक्त कोड पायथन 3 के साथ काम नहीं करता है। पायथन 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

मैं अक्सर एक पांडा डेटाफ्रेम में ताना लोड करता हूं फिर डेटाफ्रेम के प्लॉट फ़ंक्शन का उपयोग करता हूं।
यहाँ एक लाइनर है:

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

परिणामी भूखंड


3

सिर्फ क्यों नहीं:

import seaborn as sns

sns.barplot(list(D.keys()), list(D.values()))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.