কীভাবে ডেটা তালিকার সাথে পাইথনে ম্যাটপ্লটলিব ব্যবহার করে একটি হিস্টোগ্রাম প্লট করা যায়?


104

আমি matplotlib.hist()ফাংশনটি ব্যবহার করে একটি হিস্টোগ্রামের পরিকল্পনা করার চেষ্টা করছি তবে কীভাবে এটি করবেন তা সম্পর্কে আমি নিশ্চিত নই।

আমার একটা তালিকা আছে

probability = [0.3602150537634409, 0.42028985507246375, 
  0.373117033603708, 0.36813186813186816, 0.32517482517482516, 
  0.4175257731958763, 0.41025641025641024, 0.39408866995073893, 
  0.4143222506393862, 0.34, 0.391025641025641, 0.3130841121495327, 
  0.35398230088495575]

এবং নামের একটি তালিকা (স্ট্রিং)।

আমি কীভাবে প্রতিটি বারের y- মান এবং এক্স-মান হিসাবে নাম হিসাবে সম্ভাব্যতা করব?

উত্তর:


176

আপনি যদি কোনও হিস্টোগ্রাম চান, আপনাকে এক্স-ভ্যালুতে কোনও 'নাম' সংযুক্ত করার দরকার নেই, এক্স-অক্ষের মতো আপনার ডেটা বিন থাকবে:

import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
np.random.seed(42)
x = np.random.normal(size=1000)
plt.hist(x, density=True, bins=30)  # `density=False` would make counts
plt.ylabel('Probability')
plt.xlabel('Data');

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

আপনি PDFলাইন, শিরোনাম এবং কিংবদন্তির সাহায্যে আপনার হিস্টোগ্রামকে কিছুটা ফ্যানসিয়ার করতে পারেন :

import scipy.stats as st
plt.hist(x, density=True, bins=30, label="Data")
mn, mx = plt.xlim()
plt.xlim(mn, mx)
kde_xs = np.linspace(mn, mx, 301)
kde = st.gaussian_kde(x)
plt.plot(kde_xs, kde.pdf(kde_xs), label="PDF")
plt.legend(loc="upper left")
plt.ylabel('Probability')
plt.xlabel('Data')
plt.title("Histogram");

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

তবে, ওপি-র মতো আপনার কাছে যদি সীমিত সংখ্যক ডেটা পয়েন্ট থাকে তবে একটি বার প্লট আপনার ডেটা উপস্থাপন করতে আরও বোঝা দেবে (তারপরে আপনি এক্স-অক্ষের সাথে লেবেল সংযুক্ত করতে পারেন):

x = np.arange(3)
plt.bar(x, height=[1,2,3])
plt.xticks(x, ['a','b','c'])

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


4
মনে রাখবেন, পাইথনের লাইনের শেষে কোনও সেমিকোলন নেই!
Toad22222

12
@ Toad22222 এটি আইপিথন নোটবুক সেল থেকে একটি উদ্ধৃত অংশ। সেমিকোলন ছাড়াই এটি কার্যকর করার চেষ্টা করুন এবং পার্থক্যটি দেখুন। আমি যে সমস্ত কোড স্নিপেটগুলি পোস্ট করি তা আমার কম্পিউটারে পুরোপুরি চালিত হয়।
সের্গে বুশমানভ

4
আপনি যদি সের্গেই দ্বারা ব্যবহৃত আধা-কোলন সম্পর্কে ভাবছেন, প্লট অবজেক্ট সম্পর্কে লেখাটি দমন করার পরিকল্পনা করার সময় বৃহস্পতি নোটবুকগুলি (পূর্বে আইপিথন নোটবুক) কোষগুলিতে কীভাবে আধা-কোলন ব্যবহৃত হয় সে জন্য এখানে এবং # 16 দেখুন
ওয়েইন

20

আপনি যদি এখনও ম্যাটপ্লটলিব ইনস্টল না করে থাকেন তবে কেবল কমান্ডটি ব্যবহার করে দেখুন।

> pip install matplotlib

লাইব্রেরি আমদানি

import matplotlib.pyplot as plot

হিস্টোগ্রামের ডেটা:

plot.hist(weightList,density=1, bins=20) 
plot.axis([50, 110, 0, 0.06]) 
#axis([xmin,xmax,ymin,ymax])
plot.xlabel('Weight')
plot.ylabel('Probability')

হিস্টোগ্রাম প্রদর্শন করুন

plot.show()

এবং আউটপুট যেমন হয়:

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


4
প্লট.এক্সিস ([50, 110, 0, 0.06]) 'লাইন উদাহরণের জন্য অকেজো। এ ছাড়া, প্লটটির ক্ষেত্রকে হার্ডড কোড হিসাবে দেখানোর জন্য এটি হার্ড কোড করে, যদি আপনার ডেটা এটির মধ্যে পুরোপুরি ফিট না করে তবে আপনি কেন বিভ্রান্ত হতে পারেন কেন এটি সঠিকভাবে দেখায় না।
typhon04

10

যদিও প্রশ্নটি হিস্টগ্রাম ব্যবহার করে প্লট করার দাবি করেছে বলে মনে হচ্ছে matplotlib.hist() ফাংশনটি , তবে প্রশ্নটির উত্তর অংশটি বারের y- মান হিসাবে প্রদত্ত সম্ভাব্যতা এবং প্রদত্ত নামগুলির (স্ট্রিং) হিসাবে ব্যবহার করার দাবি হিসাবে একইভাবে ব্যবহার করা যাবে না এক্স-মান

আমি প্লটটি আঁকার জন্য প্রদত্ত সম্ভাবনার সাথে সম্পর্কিত নামের একটি নমুনা তালিকা ধরে নিচ্ছি। একটি সাধারণ বার প্লট প্রদত্ত সমস্যার জন্য এখানে উদ্দেশ্যটি সরবরাহ করে। নিম্নলিখিত কোড ব্যবহার করা যেতে পারে:

import matplotlib.pyplot as plt
probability = [0.3602150537634409, 0.42028985507246375, 
  0.373117033603708, 0.36813186813186816, 0.32517482517482516, 
  0.4175257731958763, 0.41025641025641024, 0.39408866995073893, 
  0.4143222506393862, 0.34, 0.391025641025641, 0.3130841121495327, 
  0.35398230088495575]
names = ['name1', 'name2', 'name3', 'name4', 'name5', 'name6', 'name7', 'name8', 'name9',
'name10', 'name11', 'name12', 'name13'] #sample names
plt.bar(names, probability)
plt.xticks(names)
plt.yticks(probability) #This may be included or excluded as per need
plt.xlabel('Names')
plt.ylabel('Probability')

5

এটি একটি পুরানো প্রশ্ন তবে পূর্বের উত্তরগুলির মধ্যে কোনটিই আসল সমস্যাটির সমাধান করতে পারে নি, অর্থাৎ এই সমস্যাটি নিজেই প্রশ্নটির সাথে রয়েছে।

প্রথমত, যদি সম্ভাব্যতাগুলি ইতিমধ্যে গণনা করা হয়েছে, যেমন হিস্টগ্রাম সমষ্টিযুক্ত ডেটা একটি সাধারণ উপায়ে পাওয়া যায় তবে সম্ভাব্যতাগুলি 1 টির মধ্যে যোগ করা উচিত They তারা স্পষ্টতই না করে এবং এর অর্থ এখানে পরিভাষা বা ডেটা সহ কিছু ভুল আছে অথবা যেভাবে প্রশ্ন জিজ্ঞাসা করা হয়।

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

তবে, প্রথম সংখ্যাটি দেখুন, সেই সম্ভাবনাগুলি সঠিক নয় এবং "হিস্টোগ্রাম" হিসাবে এই ক্ষেত্রে বার প্লট ব্যবহার করা ভুল হবে কারণ এটি অবিচ্ছিন্ন বিতরণের গল্পটি বলে না, কারণ সম্ভবত (ক্লাসগুলি ওভারল্যাপিং হয় এবং পর্যবেক্ষণগুলি একাধিক গণনা করা হয়) বার?) এবং এই জাতীয় প্লটকে এই ক্ষেত্রে কোনও হিস্টগ্রাম বলা উচিত নয়।

হিস্টোগ্রাম সংজ্ঞা অনুসারে অবিচ্ছিন্ন ভেরিয়েবল বিতরণের গ্রাফিকাল উপস্থাপনা হয় (দেখুন https://www.itl.nist.gov/div898/handbook/eda/section3/histogra.htm , https://en.wikedia.org/wiki / হিস্টগ্রাম) এবং আগ্রহের পরিবর্তনশীলের নির্বাচিত শ্রেণিতে পর্যবেক্ষণের গণনা বা ঘন ঘন প্রতিনিধিত্ব করে মাপের বার অঙ্কন করে তৈরি করা হয়। যদি চলকটি একটি অবিচ্ছিন্ন স্কেলে পরিমাপ করা হয় তবে সেগুলি ক্লাসগুলি বিন (অন্তর) হয়। হিস্টোগ্রাম তৈরির পদ্ধতির গুরুত্বপূর্ণ অংশটি কীভাবে শ্রেণিবদ্ধ পরিবর্তনশীলগুলির জন্য প্রতিক্রিয়াগুলির শ্রেণিভুক্ত (বা গোষ্ঠীকরণ ছাড়াই রাখা) বা কীভাবে সম্ভাব্য মানগুলির ডোমেনকে অন্তরগুলিতে বিভক্ত করা যায় (যেখানে বিন সীমানা স্থাপন করা যায়) কীভাবে তা চালিয়ে যাওয়া বাছাই করা হয় og ভেরিয়েবল টাইপ করুন। সমস্ত পর্যবেক্ষণগুলি উপস্থাপন করা উচিত, এবং প্রত্যেকে একবারে প্লটটিতে। এর অর্থ এই যে বার মাপের যোগফল মোট পর্যবেক্ষণের গণনার সমান হওয়া উচিত (বা পরিবর্তনশীল প্রস্থের ক্ষেত্রে তাদের অঞ্চলগুলি, যা একটি কম সাধারণ পদ্ধতির)। অথবা, যদি হিস্টোগ্রামটি স্বাভাবিক করা হয় তবে সমস্ত সম্ভাবনাগুলি অবশ্যই 1 পর্যন্ত যুক্ত করা উচিত।

যদি ডেটা নিজেই একটি প্রতিক্রিয়া হিসাবে "সম্ভাবনা "গুলির একটি তালিকা হয়, যেমন পর্যবেক্ষণগুলির প্রতিটি গবেষণার জন্য সম্ভাব্যতার মান (কোনও কিছুর) হয় তবে সর্বোত্তম উত্তরটি সহজভাবে হয় plt.hist(probability) সম্ভবত বেনিং বিকল্পের সাথে পাওয়া যায় এবং ইতিমধ্যে উপলব্ধ এক্স-লেবেলের ব্যবহার হ'ল সন্দেহজনক

তারপরে বার প্লট হিস্টোগ্রাম হিসাবে ব্যবহার করা উচিত নয় বরং সহজভাবে

import matplotlib.pyplot as plt
probability = [0.3602150537634409, 0.42028985507246375, 
  0.373117033603708, 0.36813186813186816, 0.32517482517482516, 
  0.4175257731958763, 0.41025641025641024, 0.39408866995073893, 
  0.4143222506393862, 0.34, 0.391025641025641, 0.3130841121495327, 
  0.35398230088495575]
plt.hist(probability)
plt.show()

ফলাফল সহ

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

এই জাতীয় ক্ষেত্রে matplotlib নিম্নলিখিত হিস্টگرام মানগুলির সাথে ডিফল্টরূপে উপস্থিত হয়

(array([1., 1., 1., 1., 1., 2., 0., 2., 0., 4.]),
 array([0.31308411, 0.32380469, 0.33452526, 0.34524584, 0.35596641,
        0.36668698, 0.37740756, 0.38812813, 0.39884871, 0.40956928,
        0.42028986]),
 <a list of 10 Patch objects>)

ফলাফলটি অ্যারেগুলির একটি দ্বিগুণ, প্রথম অ্যারেতে পর্যবেক্ষণ গণনা রয়েছে, অর্থাত্ প্লটের y- অক্ষের বিপরীতে কী প্রদর্শিত হবে (তারা 13 টি যোগ করে মোট পর্যবেক্ষণের সংখ্যা) এবং দ্বিতীয় অ্যারে হ'ল এক্স এর অন্তর্বর্তী সীমানা -অ্যাক্সিস

তারা দেখতে পারে যে তারা সমানভাবে ব্যবধানে রয়েছে,

x = plt.hist(probability)[1]
for left, right in zip(x[:-1], x[1:]):
  print(left, right, right-left)

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

অথবা, উদাহরণস্বরূপ 3 টি বিনের জন্য (13 টি পর্যবেক্ষণের জন্য আমার রায় কল) এই হিস্টোগ্রামটি পেতে পারে

plt.hist(probability, bins=3)

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

"বারগুলির পিছনে" থাকার প্লট ডেটা সহ

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

প্রশ্নের লেখককে স্পষ্ট করে বলা দরকার যে "সম্ভাব্যতা" মানগুলির তালিকার অর্থ কী - "সম্ভাবনা" হ'ল প্রতিক্রিয়ার পরিবর্তনশীলের একটি নাম (তাহলে কেন হিস্টোগ্রামের জন্য এক্স-লেবেল প্রস্তুত রয়েছে, এটি কোনও অর্থ দেয় না) ), বা তালিকা থেকে ডেটা থেকে সম্ভাব্যতার গণনা করা মানগুলি (তারপরে তারা 1 টি যোগ করে না এমন কোনও অর্থ নেই)।


4

এটি করার একটি খুব চারিদিকের উপায় তবে আপনি যদি কোনও হিস্টোগ্রাম তৈরি করতে চান যেখানে আপনি ইতিমধ্যে বিন মানগুলি জানেন তবে উত্সের তথ্য নেই তবে আপনি np.random.randintপ্রতিটিটির পরিসরের মধ্যে মানগুলির সঠিক সংখ্যা তৈরি করতে ফাংশনটি ব্যবহার করতে পারেন গ্রাশে হিস্ট ফাংশনটির জন্য বিন, উদাহরণস্বরূপ:

import numpy as np
import matplotlib.pyplot as plt

data = [np.random.randint(0, 9, *desired y value*), np.random.randint(10, 19, *desired y value*), etc..]
plt.hist(data, histtype='stepfilled', bins=[0, 10, etc..])

লেবেল হিসাবে আপনি এই জাতীয় কিছু পেতে বিন টিক দিয়ে x টিকগুলি সারিবদ্ধ করতে পারেন:

#The following will align labels to the center of each bar with bin intervals of 10
plt.xticks([5, 15, etc.. ], ['Label 1', 'Label 2', etc.. ])
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.