আমি হিস্টোগ্রাম তৈরি করতে ম্যাটপ্ল্লিটিব ব্যবহার করছি।
বিনের সংখ্যার বিপরীতে ম্যানুয়ালি বিনের আকার নির্ধারণের কোনও উপায় আছে কি?
আমি হিস্টোগ্রাম তৈরি করতে ম্যাটপ্ল্লিটিব ব্যবহার করছি।
বিনের সংখ্যার বিপরীতে ম্যানুয়ালি বিনের আকার নির্ধারণের কোনও উপায় আছে কি?
উত্তর:
আসলে, এটি বেশ সহজ: বিনের সংখ্যার পরিবর্তে আপনি বিন সীমানা সহ একটি তালিকা দিতে পারেন 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))
(data.max() - data.min()) / number_of_bins_you_want
। + binwidth
শুধু পরিবর্তিত হতে পারে 1
এই একটি আরো সহজে বোঝা উদাহরণ করা।
lw = 5, color = "white"
বা অনুরূপ সন্নিবেশ করায়
এন বিনের জন্য, বিন প্রান্তগুলি 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 টি মান বা এন বিনগুলিতে বিভক্ত মিনি_সেজ থেকে ম্যাক_ডেজ পর্যন্ত অ্যারে উত্পাদন করে
আমি অনুমান করি যে সহজ উপায় হ'ল আপনার ন্যূনতম এবং সর্বাধিক সর্বোচ্চ ডেটা গণনা করা, তারপরে গণনা করা L = max - min
। তারপরে আপনি L
কাঙ্ক্ষিত বিন প্রস্থ দ্বারা বিভক্ত করুন (আমি ধরে নিচ্ছি এটিই আপনি বিন আকার দ্বারা বোঝাচ্ছেন) এবং বিন্যাসের সংখ্যা হিসাবে এই মানটির সিলিংটি ব্যবহার করুন।
আমি জিনিসগুলি স্বয়ংক্রিয়ভাবে ঘটতে চাই এবং বিনের জন্য "সুন্দর" মানের উপর পড়তে চাই। নিম্নলিখিতটি বেশ ভালভাবে কাজ করছে বলে মনে হচ্ছে।
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
আমি বিনের ইউনিফর্ম করতে কোয়ান্টাইলগুলি ব্যবহার করি এবং নমুনায় লাগিয়েছি:
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')
np.arange(0, 1.01, 0.5)
বা দ্বারা প্রতিস্থাপন করতে পারেন np.linspace(0, 1, 21)
। কোন প্রান্ত নেই, তবে আমি বুঝতে পারি বাক্সগুলির সমান ক্ষেত্র রয়েছে, তবে এক্স অক্ষে আলাদা প্রস্থ রয়েছে?
আমার ওপি হিসাবে একই সমস্যা ছিল (আমি মনে করি!) তবে লাস্টালদা যেভাবে নির্দিষ্ট করেছে তাতে কাজ করতে পারিনি 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]) :
তারপরে আমি প্রতিটি বিনের আকার নির্ধারণ করতে 'ওজন' প্যারামিটার ব্যবহার করছি। এটি ওয়েট প্যারামিটারের জন্য ব্যবহৃত অ্যারে: [10,1,40,33,6]।
সুতরাং 0 থেকে 10 বিনকে 10 এর মান দেওয়া হয়, 11 থেকে 20 বিনকে 1 এর মান দেওয়া হয়, 21 থেকে 30 বিনকে 40 এর মান দেওয়া হয় ইত্যাদি etc.