অভিধান ব্যবহার করে ম্যাটপ্ল্লোব ব্যবহার করে একটি বার প্লট করুন


96

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

আপনি কি বিশেষভাবে ভাগ করতে পারেন যা কাজ করে না? আপনি কি একটি ব্যতিক্রম পেতে? কি ব্যতিক্রম? যথাসম্ভব তথ্য শেয়ার করুন।
ইনবার রোজ

@ ইন্নবরস, দুঃখিত, আমি প্রশ্নটি ত্রুটিটি দিয়ে দেখিয়েছি ... স্ট্রিং বা বাফার সম্পর্কিত কিছু ... আমি এই ত্রুটি বার্তাটি বুঝতে পারি না।
otmezger

4
আপনি কী অর্জন করতে চান তা পরিষ্কার নয়, তবে ax.bar(D,range(1,len(D)+1,1),0.5)প্রথম যুক্তিতে আপনার ক্ষেত্রে সংখ্যার একটি তালিকা হওয়া উচিত D.values()
অ্যাড্রিয়ানপ

4
এটির জন্য কমপক্ষে আমার জ্ঞানের পক্ষে একটি ওয়ানলাইনার সম্ভব নয়।
অ্যাড্রিয়ানপ

4
আপনি এটির জন্য গিথুব সাইটে একটি বৈশিষ্ট্য অনুরোধ জমা দিতে চাইতে পারেন, কারণ এটি দরকারী বলে মনে হচ্ছে না।
টাকসওয়েল

উত্তর:


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()))পাইথন 3 পড়তে হবে কারণ D.keys()একটি জেনারেটর দেয় যা ম্যাটপ্ল্লিটিব সরাসরি ব্যবহার করতে পারে না।


4
আপনি অবশ্যই কোনও ফাংশনে এই দুটি লাইন
গুটিয়ে

4
আপনি চিত্রে এবং অক্ষ বস্তু ব্যবহার করেন, তাহলে এটাax.set_xticklabels
মার্ক

4
ধন্যবাদ! তবে আমার প্লট টেক্সট নিয়ে কিছু এস্টেটিক সমস্যা রয়েছে, দয়া করে কীভাবে আমাদের অনুভূমিকভাবে উলম্বভাবে সরানো যায় তা আমাদের বলতে পারেন।
মোল্ডোভেন

4
ডিক বাছাই না করা হলে কী-মানযুক্ত জোড়গুলি সারিবদ্ধ থাকে?
এসএসএম

4
পাইথন ডিক্টস বাছাই করা যায় না। ফলস্বরূপ, আদেশ সর্বদা স্বেচ্ছাসেবী হয়। যাইহোক, কী এবং মানগুলি সর্বদা উপরের কোডের সাথে একত্রিত হয়।
ডেভিড জুইকার

41

এখানে বেশিরভাগ উত্তরগুলির থেকে এটি সামান্য সরল:

import matplotlib.pyplot as plt

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

এখানে চিত্র বর্ণনা লিখুন


35

ভবিষ্যতের রেফারেন্সের জন্য, উপরের কোডটি পাইথন 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')

ফলস্বরূপ প্লট


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.