2013-04-15 10 views
42

का उपयोग करके 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 
+0

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

+0

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

+2

यह स्पष्ट नहीं है कि आप क्या हासिल करना चाहते हैं, लेकिन 'ax.bar (डी, रेंज (1, लेन (डी) +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() 

ध्यान दें कि अंत से पहले लाइन पढ़ना चाहिए plt.xticks (रेंज (लेन (डी)), सूची (D.keys())) python3 में, क्योंकि D.keys() जनरेटर देता है, जो matplotlib सीधे उपयोग नहीं कर सकता है।

+2

आप निश्चित रूप से उन दो पंक्तियों को एक फ़ंक्शन में लपेट सकते हैं और फिर यह एक-लाइनर बन जाता है;) – tacaswell

+2

यदि आप आकृति और अक्ष वस्तुओं का उपयोग करते हैं, तो यह 'ax.set_xticklabels' है ' – Mark

+1

धन्यवाद! लेकिन मेरे पास plt.xticks के साथ कुछ एसेटिक समस्याएं हैं, क्या आप कृपया हमें बता सकते हैं कि उन्हें क्षैतिज रूप से लंबवत कैसे स्थानांतरित किया जाए। – moldovean

21

भविष्य के संदर्भ के लिए, उपर्युक्त कोड पायथन 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() 
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

मैं अक्सर तो एक पांडा DataFrame में dict लोड DataFrame की साजिश समारोह का उपयोग करें।

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

resulting plot

संबंधित मुद्दे