ম্যাটপ্লোটিলেব বিনের আকার (হিস্টোগ্রাম)


149

আমি হিস্টোগ্রাম তৈরি করতে ম্যাটপ্ল্লিটিব ব্যবহার করছি।

বিনের সংখ্যার বিপরীতে ম্যানুয়ালি বিনের আকার নির্ধারণের কোনও উপায় আছে কি?

উত্তর:


270

আসলে, এটি বেশ সহজ: বিনের সংখ্যার পরিবর্তে আপনি বিন সীমানা সহ একটি তালিকা দিতে পারেন give এগুলিও অসম বিতরণ করা যেতে পারে:

plt.hist(data, bins=[0, 10, 20, 30, 40, 50, 100])

আপনি যদি কেবল সেগুলি সমানভাবে বিতরণ করতে চান তবে আপনি কেবল পরিসীমা ব্যবহার করতে পারেন:

plt.hist(data, bins=range(min(data), max(data) + binwidth, binwidth))

মূল উত্তরে যুক্ত হয়েছে

উপরের লাইনটি কেবল dataপূর্ণসংখ্যায় ভরাটের জন্য কাজ করে । ম্যাক্রোকোজমে যেমন উল্লেখ করা হয়েছে, তীরের জন্য আপনি ব্যবহার করতে পারেন:

import numpy as np
plt.hist(data, bins=np.arange(min(data), max(data) + binwidth, binwidth))

20
এটি ফ্লোটের সাথে কাজ করতে পেতে পরিসীমা (...) এর সাথে এনপি.আরঞ্জ (...) প্রতিস্থাপন করুন।
ম্যাক্রোকোজমে

6
এখানে বিনবিদ কি? আপনি আগে এই মান সেট করেছেন?
ইউজারওয়াই

1
আমার বিশ্বাস এই উদাহরণে binwidth দ্বারা পাওয়া যেতে পারে: (data.max() - data.min()) / number_of_bins_you_want+ binwidthশুধু পরিবর্তিত হতে পারে 1এই একটি আরো সহজে বোঝা উদাহরণ করা।
জারাদ

2
উপরের কোডিংগ্যাটসের দুর্দান্ত সমাধানের জন্য, ফ্লোটের ডেটার জন্য, আপনি যদি হিস্টগ্রাম বারগুলি এক্স-টিকের বার সীমা না রেখে ইন্টিজার এক্স-টিক্সের চারপাশে কেন্দ্রীভূত করতে চান তবে নীচের টুইটটি চেষ্টা করুন: বিনস = এনপি.আরঞ্জ (ডিএমএন - 0.5, dmax + 0.5 + বিনউইথ, বিনউইথ)
ডেভডাব্লু

3
বিকল্প lw = 5, color = "white"বা অনুরূপ সন্নিবেশ করায়
বারগুলির

13

এন বিনের জন্য, বিন প্রান্তগুলি N + 1 মানগুলির তালিকা দ্বারা নির্দিষ্ট করা হয় যেখানে প্রথম এন নীচের বিন প্রান্ত দেয় এবং +1 শেষ বিনের উপরের প্রান্তটি দেয় edge

কোড:

from numpy import np; from pylab import *

bin_size = 0.1; min_edge = 0; max_edge = 2.5
N = (max_edge-min_edge)/bin_size; Nplus1 = N + 1
bin_list = np.linspace(min_edge, max_edge, Nplus1)

মনে রাখবেন যে লিনস্পেসটি n_ 1 টি মান বা এন বিনগুলিতে বিভক্ত মিনি_সেজ থেকে ম্যাক_ডেজ পর্যন্ত অ্যারে উত্পাদন করে


1
নোট করুন যে বিনগুলি তাদের নিম্ন সীমাবদ্ধ এবং তাদের উপরের সীমানার সাথে একচেটিয়া, এন + 1 (সর্বশেষ) বিন ব্যতীত যা উভয় সীমাতে অন্তর্ভুক্ত।
lukewitmer

4

আমি অনুমান করি যে সহজ উপায় হ'ল আপনার ন্যূনতম এবং সর্বাধিক সর্বোচ্চ ডেটা গণনা করা, তারপরে গণনা করা L = max - min। তারপরে আপনি Lকাঙ্ক্ষিত বিন প্রস্থ দ্বারা বিভক্ত করুন (আমি ধরে নিচ্ছি এটিই আপনি বিন আকার দ্বারা বোঝাচ্ছেন) এবং বিন্যাসের সংখ্যা হিসাবে এই মানটির সিলিংটি ব্যবহার করুন।


ধন্যবাদ আমি মনে মনে ঠিক এই ছিল, ধন্যবাদ। খুব সহজ উপায় ছিল কিনা তা ভাবছিলাম তবে এটি মনে হয় ধন্যবাদ!
স্যাম ক্রিমার

রাউন্ড নম্বর ব্যবহার করে আমি এই পদ্ধতির সাথে একটি রাউন্ড বিন আকার পাই না। কেউ অভিজ্ঞতা আছে?
ব্র্যাড উরণী

3

আমি জিনিসগুলি স্বয়ংক্রিয়ভাবে ঘটতে চাই এবং বিনের জন্য "সুন্দর" মানের উপর পড়তে চাই। নিম্নলিখিতটি বেশ ভালভাবে কাজ করছে বলে মনে হচ্ছে।

import numpy as np
import numpy.random as random
import matplotlib.pyplot as plt
def compute_histogram_bins(data, desired_bin_size):
    min_val = np.min(data)
    max_val = np.max(data)
    min_boundary = -1.0 * (min_val % desired_bin_size - min_val)
    max_boundary = max_val - max_val % desired_bin_size + desired_bin_size
    n_bins = int((max_boundary - min_boundary) / desired_bin_size) + 1
    bins = np.linspace(min_boundary, max_boundary, n_bins)
    return bins

if __name__ == '__main__':
    data = np.random.random_sample(100) * 123.34 - 67.23
    bins = compute_histogram_bins(data, 10.0)
    print(bins)
    plt.hist(data, bins=bins)
    plt.xlabel('Value')
    plt.ylabel('Counts')
    plt.title('Compute Bins Example')
    plt.grid(True)
    plt.show()

ফলাফলটি বিন আকারের সুন্দর অন্তরগুলিতে আবদ্ধ থাকে।

[-70. -60. -50. -40. -30. -20. -10.   0.  10.  20.  30.  40.  50.  60.]

গণিত বিন হিস্টোগ্রাম


ঠিক কী আমি খুঁজছিলাম! তবে কিছু ক্ষেত্রে ভাসমান পয়েন্ট যথার্থতার কারণে এন_বিনগুলি বৃত্তাকার হয়ে যায়। জন্য যেমন desired_bin_size=0.05, min_boundary=0.850, max_boundary=2.05হিসাব n_binsহয়ে int(23.999999999999993)যা 23 পরিবর্তে 24-এ এবং সেইজন্য এক ইবনে খুব অল্প ফলাফল নেই। পূর্ণসংখ্যার রূপান্তরটি আমার পক্ষে কাজ করার আগে একটি বৃত্তাকার:n_bins = int(round((max_boundary - min_boundary) / desired_bin_size, 0)) + 1
এম শ্লেঙ্কার

3

আমি বিনের ইউনিফর্ম করতে কোয়ান্টাইলগুলি ব্যবহার করি এবং নমুনায় লাগিয়েছি:

bins=df['Generosity'].quantile([0,.05,0.1,0.15,0.20,0.25,0.3,0.35,0.40,0.45,0.5,0.55,0.6,0.65,0.70,0.75,0.80,0.85,0.90,0.95,1]).to_list()

plt.hist(df['Generosity'], bins=bins, normed=True, alpha=0.5, histtype='stepfilled', color='steelblue', edgecolor='none')

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


1
ভালো বুদ্ধি. আপনি কোয়ান্টাইলের তালিকাটি দ্বারা np.arange(0, 1.01, 0.5)বা দ্বারা প্রতিস্থাপন করতে পারেন np.linspace(0, 1, 21)। কোন প্রান্ত নেই, তবে আমি বুঝতে পারি বাক্সগুলির সমান ক্ষেত্র রয়েছে, তবে এক্স অক্ষে আলাদা প্রস্থ রয়েছে?
টমাসজ গ্যান্ডোর

2

আমার ওপি হিসাবে একই সমস্যা ছিল (আমি মনে করি!) তবে লাস্টালদা যেভাবে নির্দিষ্ট করেছে তাতে কাজ করতে পারিনি get আমি প্রশ্নটি সঠিকভাবে ব্যাখ্যা করেছি কিনা জানি না, তবে আমি আরও একটি সমাধান খুঁজে পেয়েছি (যদিও এটি করা সম্ভবত এটি খুব খারাপ উপায়)।

এইভাবেই আমি এটি করেছি:

plt.hist([1,11,21,31,41], bins=[0,10,20,30,40,50], weights=[10,1,40,33,6]);

যা এটি তৈরি করে:

ম্যাটপ্লটলিবের মধ্যে হিস্টোগ্রাফ গ্রাফ প্রদর্শন করা চিত্র

সুতরাং প্রথম প্যারামিটারটি মূলত বিনটিকে 'আরম্ভকারী' করে তোলে - আমি বিশেষত এমন একটি সংখ্যা তৈরি করছি যা আমি বিন প্যারামিটারে নির্ধারিত সীমার মধ্যে অবস্থিত।

এটি প্রদর্শনের জন্য, প্রথম প্যারামিটারের অ্যারে দেখুন ([1,11,21,31,41]) এবং দ্বিতীয় প্যারামিটারে 'বিনস' অ্যারে ([0,10,20,30,40,50]) :

  • 1 নম্বর (প্রথম অ্যারে থেকে) 0 এবং 10 এর মধ্যে পড়ে ('বিন' অ্যারেতে)
  • 11 নম্বর (প্রথম অ্যারে থেকে) 11 থেকে 20 এর মধ্যে পড়ে ('বিন' অ্যারেতে)
  • 21 নম্বর (প্রথম অ্যারে থেকে) 21 থেকে 30 ('বিন' অ্যারেতে) ইত্যাদির মধ্যে পড়ে etc.

তারপরে আমি প্রতিটি বিনের আকার নির্ধারণ করতে 'ওজন' প্যারামিটার ব্যবহার করছি। এটি ওয়েট প্যারামিটারের জন্য ব্যবহৃত অ্যারে: [10,1,40,33,6]।

সুতরাং 0 থেকে 10 বিনকে 10 এর মান দেওয়া হয়, 11 থেকে 20 বিনকে 1 এর মান দেওয়া হয়, 21 থেকে 30 বিনকে 40 এর মান দেওয়া হয় ইত্যাদি etc.


3
আমি মনে করি আপনার কাছে হিস্টোগ্রাম ফাংশনটি কীভাবে কাজ করে তা একটি প্রাথমিক ধারণা unders এটি কাঁচা তথ্য আশা করে। সুতরাং, আপনার উদাহরণে, আপনার ডেটা অ্যারেতে 0 টি 10 ​​এর মধ্যে 10 টি মান, 10 এবং 20 এর মধ্যে 1 টির মান থাকা উচিত। তারপরে ফাংশনটি যোগফল এবং অঙ্কন করে। আপনি উপরের যা করছেন তা একদম কর্মবিরোধী কারণ আপনার ইতিমধ্যে অঙ্কগুলি রয়েছে (যা আপনি "ওয়েট" বিকল্পটির অপব্যবহার করে গ্রাফের মধ্যে .োকান)। আশা করি এটি কিছুটা বিভ্রান্তি দূর করে।
কোডিংগেট

-1

পূর্ণসংখ্যার এক্স-মান সহ একটি হিস্টোগ্রামের জন্য আমি ব্যবহার করে শেষ করেছি

plt.hist(data, np.arange(min(data)-0.5, max(data)+0.5))
plt.xticks(range(min(data), max(data)))

০.০ এর অফসেটটি এক্স-অক্ষের মানগুলিকে কেন্দ্র করে। plt.xticksকল যে পূর্ণসংখ্যা একটি টিক যোগ করা হয়েছে।

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