জ্ঞানপ্লট ব্যবহার করে হিস্টোগ্রাম?


202

আমার .ডাট ফাইলটি ইতিমধ্যে সঠিকভাবে ডেটা বাক্স করে থাকলে জিনুপ্লটে কীভাবে একটি হিস্টোগ্রাম তৈরি করতে হয় (কেবল "বাক্স সহ" ব্যবহার করুন) know সংখ্যার একটি তালিকা নেওয়ার এবং ব্যবহারকারীর প্রদত্ত রেঞ্জ এবং বিন আকারের উপর ভিত্তি করে gnuplot একটি হিস্টোগ্রাম দেওয়ার কোনও উপায় আছে কি?


2
যদি আপনি উত্তর না পান তবে এমন অন্যান্য সরঞ্জাম রয়েছে যা এই জাতীয় জিনিসগুলি বোঝায়। আমি আশেপাশের আরও অনেকগুলি রুট ( root.cern.ch ) ব্যবহার করি এবং আর কমপক্ষে আরও কয়েকটি বিকল্প রয়েছে।
dmckee --- প্রাক্তন-মডারেটর বিড়ালছানা

1
বিন হিস্টোগ্রামের প্রতিটি বারের জন্য একত্রে সংগ্রহ করা মানগুলির পরিসীমা। প্রতিটি বিনের একটি নিম্ন এবং উপরের সীমা থাকে এবং সেই পরিসরের মান সহ সমস্ত ডেটা সেই বারের দিকে গণনা করা হয়। বিনডের অর্থ হল যে আমার ডেটা ফাইলটি প্রতিটি বিনের মধ্যে কয়টি ডেটা পয়েন্ট পড়ে তার দ্বারা ইতিমধ্যে সংগঠিত হয় তাই এটি হিস্টোগ্রাম হিসাবে প্লট করার জন্য প্রস্তুত।
মেরি

উত্তর:


225

হ্যাঁ, এবং এটির দ্রুত এবং সহজ যদিও খুব লুকানো রয়েছে:

binwidth=5
bin(x,width)=width*floor(x/width)

plot 'datafile' using (bin($1,binwidth)):(1.0) smooth freq with boxes

help smooth freqউপরেরটি কেন হিস্টোগ্রাম তৈরি করে তা পরীক্ষা করে দেখুন

রেঞ্জগুলির সাথে ডিল করার জন্য কেবল এক্সরেঞ্জ ভেরিয়েবল সেট করুন।


11
আমি মনে করি @ ক্রিসডাব্লু এর নীচে উত্তর যে কেউ Gnuplot মধ্যে একটি হিস্টোগ্রাম করতে চান তার জন্য লক্ষ্য করার জন্য একটি গুরুত্বপূর্ণ পয়েন্ট এনেছে।
অভিনব

2
খুব সাবধানতা অবলম্বন করুন, সেটে কেবল "অনুপস্থিত" বিন না থাকলে এটি কাজ করে ... এই ফাংশনটি অনুপস্থিত বিনের y- মানটিকে পূর্ববর্তী অনুপস্থিত বিনের y- মানের সাথে স্থির করে। এটি খুব বিভ্রান্তিকর হতে পারে !!!
পিংকফ্লয়েড

1
আমি set boxwidth binwidthউপরে যোগ করতে হবে । এটা আমার জন্য সত্যিই সহায়ক ছিল।
যাক্কো

90

বর্ন 2 স্মাইলের খুব দরকারী উত্তরটির সাথে আমার কয়েকটি সংশোধন / সংযোজন রয়েছে:

  1. খালি বিন্দুগুলি সংলগ্ন বিনের বাক্সটিকে ভুলভাবে তার স্থানটিতে প্রসারিত করেছিল; এটি ব্যবহার এড়ানোset boxwidth binwidth
  2. বোর্ন 2 স্মাইলের সংস্করণে, বিনগুলি তাদের নিম্ন সীমানাকে কেন্দ্র করে রেন্ডার করা হয়। দৃ they়ভাবে তাদের নিম্ন সীমানা থেকে উপরের সীমানা পর্যন্ত প্রসারিত করা উচিত। binফাংশনটি সংশোধন করে এটি সংশোধন করা যেতে পারে :bin(x,width)=width*floor(x/width) + width/2.0

10
আসলে দ্বিতীয় bin(x,width)=width*floor(x/width) + binwidth/2.0
ভাগটি

8
আপনি বলতে চাচ্ছেন bin(x,width)=width*floor(x/width) + width/2.0। আমরা যদি widthএকটি তর্ক হিসাবে পাস হয়, তাহলে এটি ব্যবহার করুন। :-)
মিতার

78

খুব সাবধানতা অবলম্বন করুন: এই পৃষ্ঠার সমস্ত উত্তরই স্পষ্টভাবে সিদ্ধান্ত নিয়েছে যে কোথায় বেনিং শুরু হয় - বাম-সর্বাধিক বিনের বাম দিকের প্রান্তটি, যদি আপনি চান - ব্যবহারকারীর হাত থেকে। ব্যবহারকারী যদি বিন্নিং শুরু হয় সে সম্পর্কে তার নিজের সিদ্ধান্তের সাথে ডেটা বেঞ্চ করার জন্য এই ফাংশনগুলির সাথে যদি কোনও সংযুক্ত করে থাকে (উপরের সাথে সংযুক্ত ব্লগে যেমন করা হয়) উপরের ফাংশনগুলি সবই ভুল। 'মিন' বিনের জন্য একটি স্বেচ্ছাসেবী সূচনার পয়েন্ট সহ সঠিক ফাংশনটি হ'ল:

bin(x) = width*(floor((x-Min)/width)+0.5) + Min

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

এই ফাংশনটি কার্যক্রমে বিবেচনা করুন:

Min = 0.25 # where binning starts
Max = 2.25 # where binning ends
n = 2 # the number of bins
width = (Max-Min)/n # binwidth; evaluates to 1.0
bin(x) = width*(floor((x-Min)/width)+0.5) + Min

উদাহরণস্বরূপ, মান 1.1 সত্যই বাম বাক্সে পড়ে:

  • এই ফাংশনটি এটি সঠিকভাবে বাম বিনের (0.75) কেন্দ্রে মানচিত্র করে;
  • বর্ন 2 স্মাইলের উত্তর, বিন (এক্স) = প্রস্থ * তল (এক্স / প্রস্থ) ভুলভাবে এটিকে 1 এ মানচিত্র করে;
  • মাস 90 এর উত্তর, বিন (এক্স) = প্রস্থ * তল (এক্স / প্রস্থ) + বিনবিদ / ২.০, এটি ভুলভাবে মানচিত্রে 1.5 এ নিয়েছে।

বর্ন 2 স্মাইলের উত্তর কেবলমাত্র সঠিক তবেই যদি বিন সীমানা (এন + 0.5) * বিনভিডথ (যেখানে এন পূর্ণসংখ্যার উপর দিয়ে চলে)। মাস 90 এর উত্তর কেবলমাত্র সঠিক যদি বিন * সীমানা n * দ্বিপথের সাথে দেখা দেয়।


48

আপনি কি এই জাতীয় গ্রাফের মতো প্লট করতে চান? এখানে চিত্র বর্ণনা লিখুন হ্যাঁ? তারপরে আপনি আমার ব্লগ নিবন্ধটি দেখে নিতে পারেন: http://gnuplot-surprising.blogspot.com/2011/09/statistic-analysis-and-histogram.html

কোড থেকে মূল লাইনগুলি:

n=100 #number of intervals
max=3. #max value
min=-3. #min value
width=(max-min)/n #interval width
#function used to map a value to the intervals
hist(x,width)=width*floor(x/width)+width/2.0
set boxwidth width*0.9
set style fill solid 0.5 # fill style

#count and plot
plot "data.dat" u (hist($1,width)):(1.0) smooth freq w boxes lc rgb"green" notitle

10

যথারীতি, জ্নুপ্লট মিষ্টি দেখতে গ্রাফের চক্রান্ত করার জন্য একটি দুর্দান্ত সরঞ্জাম এবং এটি সমস্ত ধরণের গণনা সম্পাদন করার জন্য তৈরি করা যেতে পারে। যাইহোক , এটি একটি ক্যালকুলেটর হিসাবে পরিবেশন করার চেয়ে ডেটা প্লট করার উদ্দেশ্যে এবং প্রায়শই আরও "জটিল" গণনা করার জন্য একটি বাহ্যিক প্রোগ্রাম (উদাহরণস্বরূপ অক্টাভ) ব্যবহার করা সহজ, এই ফাইলটি কোনও ফাইলে সংরক্ষণ করে, তারপরে Gnuplot ব্যবহার করার জন্য গ্রাফ উপরের সমস্যার জন্য, "হিস্ট" ফাংশনটি [freq,bins]=hist(data)অষ্টাভ ব্যবহার করে দেখুন , তারপরে এটি জ্নুপ্লট ব্যবহার করে প্লট করুন

set style histogram rowstacked gap 0
set style fill solid 0.5 border lt -1
plot "./data.dat" smooth freq with boxes

7

আমি এই আলোচনাটিকে অত্যন্ত দরকারী বলে খুঁজে পেয়েছি তবে আমি কিছু "রাউন্ডিং অফ" সমস্যার অভিজ্ঞতা পেয়েছি।

আরও স্পষ্টভাবে, 0.05 এর দ্বিবিধ ব্যবহার করে, আমি লক্ষ্য করেছি যে এখানে উপস্থাপিত কৌশলগুলির সাথে, তথ্য পয়েন্টগুলি যা 0.1 এবং 0.15 পড়ছে একই বিনটিতে পড়ে। এটি (স্পষ্টতই অযাচিত আচরণ) সম্ভবত "তল" ফাংশনের কারণে।

এটি রোধ করার চেষ্টা করার জন্য পরকালের আমার ক্ষুদ্র অবদান।

bin(x,width,n)=x<=n*width? width*(n-1) + 0.5*binwidth:bin(x,width,n+1)
binwidth = 0.05
set boxwidth binwidth
plot "data.dat" u (bin($1,binwidth,1)):(1.0) smooth freq with boxes

এই পুনরাবৃত্তি পদ্ধতিটি এক্স> = 0 এর জন্য; আরও সাধারণ কিছু পাওয়ার জন্য কেউ আরও শর্তযুক্ত বিবৃতি দিয়ে এটিকে সাধারণীকরণ করতে পারে।


6

আমাদের পুনরাবৃত্তির পদ্ধতি ব্যবহার করার দরকার নেই, এটি ধীর হতে পারে। আমার সমাধানটি ইনস্ট্রিনসিক ফাংশন ইন্ট বা তল অন্তর্নিহিত কোনও ব্যবহারকারী-সংজ্ঞায়িত ফাংশন রিন্ট ব্যবহার করছে।

rint(x)=(x-int(x)>0.9999)?int(x)+1:int(x)

এই ফাংশন দিতে হবে rint(0.0003/0.0001)=3, যখন int(0.0003/0.0001)=floor(0.0003/0.0001)=2

কেন? পার্ল ইন ফাংশন এবং প্যাডিং শূন্যগুলি দয়া করে দেখুন


4

বর্ন 2 স্মাইলের সমাধানে আমার কিছুটা পরিবর্তন আছে।

আমি জানি যে এটি কোনও তাত্পর্যপূর্ণ নয়, তবে আপনি কেবল এটির ক্ষেত্রে চাইবেন। যদি আপনার ডেটা পূর্ণসংখ্যার হয় এবং আপনার ভাসমান বিন আকারের প্রয়োজন হতে পারে (অন্য কোনও ডেটার সেট বা ফাইন গ্রিডে প্লটের ঘনত্বের সাথে তুলনা করার জন্য) আপনার মেঝেতে 0 থেকে 1 এর মধ্যে একটি এলোমেলো সংখ্যা যুক্ত করতে হবে। অন্যথায়, রাউন্ড আপ ত্রুটির কারণে স্পাইক থাকবে। floor(x/width+0.5)এটি করবে না কারণ এটি এমন প্যাটার্ন তৈরি করবে যা মূল ডেটার সাথে সত্য নয়।

binwidth=0.3
bin(x,width)=width*floor(x/width+rand(0))

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

ঠিক আছে, সম্ভবত ব্যাখ্যাটি এত সংক্ষিপ্ত, যে এটি আরও কংক্রিট পরীক্ষার কেস ছাড়া এটি বুঝতে পারে না। আমি আপনার উত্তরের একটি সংক্ষিপ্ত সম্পাদনা করব যাতে আমি ডাউনটা কে পূর্বাবস্থায় ফিরিয়ে আনতে পারি;)
ক্রিস্টোফ

সাধারণ বিতরণের পূর্ণসংখ্যার বিবেচনা করুন। যেহেতু তারা পূর্ণসংখ্যা, তাদের অনেকেরই একই x / প্রস্থ থাকবে। ধরা যাক যে সংখ্যাটি 1.3। মেঝে (x / প্রস্থ + 0.5) এর সাথে তাদের সকলকে বিন 1 হিসাবে অর্পণ করা হবে তবে 1.3 এর ঘনত্বের দিক থেকে আসলে কী বোঝায় যে তাদের 70%% বিন 1 এবং 30% বিনে হওয়া উচিত। র্যান্ড (0 ) সঠিক ঘনত্ব রাখে। সুতরাং, 0.5 স্পাইক তৈরি করে এবং র্যান্ড (0) এটি সত্য রাখে। আমি এইচএসএক্সজেড দ্বারা চিত্রটি 0.5 এর পরিবর্তে র‌্যান্ড (0) ব্যবহার করে আরও মসৃণ করব। এটি কেবল বৃত্তাকার নয়, এটি বিনা পার্থক্য ছাড়া গোলাকার।
পথ 4

3

বিনিং কার্যাদি সম্পর্কে শ্রদ্ধার সাথে আমি এখনও অবধি প্রদত্ত ফাংশনগুলির ফলাফল আশা করিনি। যথা, যদি আমার দ্বিবিধটি 0.001 হয় তবে এই ফাংশনগুলি 0.005 পয়েন্টে বিনগুলি কেন্দ্র করছিল, আমি বাইন 0.001 সীমানায় কেন্দ্রীভূত করা আরও স্বজ্ঞাত বলে মনে করি।

অন্য কথায়, আমি চাই

Bin 0.001 contain data from 0.0005 to 0.0014
Bin 0.002 contain data from 0.0015 to 0.0024
...

আমি যে বিনিং কাজটি নিয়ে এসেছি তা হ'ল

my_bin(x,width)     = width*(floor(x/width+0.5))

এখানে দেওয়া কিছু বিন ফাংশনগুলির সাথে এটির তুলনা করার জন্য এখানে একটি স্ক্রিপ্ট রয়েছে:

rint(x) = (x-int(x)>0.9999)?int(x)+1:int(x)
bin(x,width)        = width*rint(x/width) + width/2.0
binc(x,width)       = width*(int(x/width)+0.5)
mitar_bin(x,width)  = width*floor(x/width) + width/2.0
my_bin(x,width)     = width*(floor(x/width+0.5))

binwidth = 0.001

data_list = "-0.1386 -0.1383 -0.1375 -0.0015 -0.0005 0.0005 0.0015 0.1375 0.1383 0.1386"

my_line = sprintf("%7s  %7s  %7s  %7s  %7s","data","bin()","binc()","mitar()","my_bin()")
print my_line
do for [i in data_list] {
    iN = i + 0
    my_line = sprintf("%+.4f  %+.4f  %+.4f  %+.4f  %+.4f",iN,bin(iN,binwidth),binc(iN,binwidth),mitar_bin(iN,binwidth),my_bin(iN,binwidth))
    print my_line
}

এবং এখানে আউটপুট

   data    bin()   binc()  mitar()  my_bin()
-0.1386  -0.1375  -0.1375  -0.1385  -0.1390
-0.1383  -0.1375  -0.1375  -0.1385  -0.1380
-0.1375  -0.1365  -0.1365  -0.1375  -0.1380
-0.0015  -0.0005  -0.0005  -0.0015  -0.0010
-0.0005  +0.0005  +0.0005  -0.0005  +0.0000
+0.0005  +0.0005  +0.0005  +0.0005  +0.0010
+0.0015  +0.0015  +0.0015  +0.0015  +0.0020
+0.1375  +0.1375  +0.1375  +0.1375  +0.1380
+0.1383  +0.1385  +0.1385  +0.1385  +0.1380
+0.1386  +0.1385  +0.1385  +0.1385  +0.1390
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.