ম্যাটপ্লোটিলেবে কীভাবে ঘনত্বের প্লট তৈরি করবেন?


122

আরআই এ করে কাঙ্ক্ষিত আউটপুট তৈরি করতে পারে:

data = c(rep(1.5, 7), rep(2.5, 2), rep(3.5, 8),
         rep(4.5, 3), rep(5.5, 1), rep(6.5, 8))
plot(density(data, bw=0.5))

আর মধ্যে ঘনত্বের প্লট

পাইথনে (ম্যাটপ্ল্লিটিবের সাথে) আমার কাছে সবচেয়ে কাছেরটি ছিল একটি সাধারণ হিস্টোগ্রাম সহ:

import matplotlib.pyplot as plt
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
plt.hist(data, bins=6)
plt.show()

ম্যাটপ্লোটিলেবে হিস্টোগ্রাম

আমি নর্মড = ট্রু প্যারামিটার চেষ্টা করেছিলাম তবে হিস্টোগ্রামের সাথে গাউসিয়ান ফিট করার চেষ্টা করা ছাড়া আর কিছুই পাইনি।

আমার সর্বশেষ চেষ্টাগুলি ছিল ওয়েবে scipy.statsএবং gaussian_kdeউদাহরণগুলি অনুসরণ করে, কিন্তু আমি এখনও অবধি ব্যর্থ।


কটাক্ষপাত আছে seaborn stackoverflow.com/a/32803224/1922302
johk95

উত্তর:


124

gaussian_kdeসোভেন স্কিপি থেকে ক্লাসটি কীভাবে ব্যবহার করবেন তা দেখিয়েছেন , তবে আপনি খেয়াল করবেন যে আপনি আর দিয়ে কী উত্পন্ন করেছেন তার মতো দেখতে তেমন লাগে না This এটি কারণ gaussian_kdeস্বয়ংক্রিয়ভাবে ব্যান্ডউইথকে অনুমান করার চেষ্টা করে। আপনি ফাংশন পরিবর্তন করে ভাবে ব্যান্ডউইথ সঙ্গে খেলা করতে পারেন covariance_factorএর gaussian_kdeবর্গ। প্রথমত, ফাংশনটি পরিবর্তন না করে আপনি যা পান তা এখানে:

বিকল্প পাঠ

তবে, আমি যদি নিম্নলিখিত কোড ব্যবহার করি:

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import gaussian_kde
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
density = gaussian_kde(data)
xs = np.linspace(0,8,200)
density.covariance_factor = lambda : .25
density._compute_covariance()
plt.plot(xs,density(xs))
plt.show()

আমি পাই

বিকল্প পাঠ

যা আপনি আর থেকে পেয়ে যাচ্ছেন তার খুব কাছাকাছি I আমি কী করেছি? এর ব্যান্ডউইথের গণনা করতে gaussian_kdeএকটি পরিবর্তনযোগ্য ফাংশন ব্যবহার করে covariance_factor। ফাংশনটি পরিবর্তন করার আগে, এই ডেটাটির জন্য কোভরিয়েন্স_ফ্যাক্টর দ্বারা ফিরে আসা মানটি ছিল প্রায় 5 ডলার। এটি কমিয়ে ব্যান্ডউইদথকে কমিয়ে আনা হয়েছে। আমাকে _compute_covarianceসেই ফাংশনটি পরিবর্তন করার পরে কল করতে হয়েছিল যাতে সমস্ত কারণকে সঠিকভাবে গণনা করা যায়। এটি আর এর বিডাব্লু প্যারামিটারের সাথে সঠিক চিঠিপত্র নয়, তবে আশা করা যায় এটি আপনাকে সঠিক দিকে যেতে সহায়তা করবে।


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

4
(এখনও মন্তব্য সম্পাদনার সাথে লড়াই করে) এখানে গাউসিয়ান_কেডির একটি সাবক্লাস রয়েছে যা ব্যান্ডউইদথকে একটি আর্গুমেন্ট এবং আরও উদাহরণ হিসাবে সেট করতে দেয়: mail.scipy.org/pipermail/scipy-user/2010- জানুয়ারী / 023877.html এবং এখানে একটি বর্ধন রয়েছে প্রকল্পে টিকিট .scipy.org/ scipy/ ticket/ 1092 । দ্রষ্টব্য, গাউসিয়ান_কেডি এন-ডাইমেনশনাল ডেটার জন্য ডিজাইন করা হয়েছে।
জোসেফ

11
@ গ্যাভিন সিম্পসন, হ্যাঁ, আর এর পরিমাণ আরও কম। এটি পরিসংখ্যান গণনা এবং গ্রাফিক্স জন্য তৈরি করা হয়। পাইথন একটি সাধারণ প্রোগ্রামিং ল্যাঙ্গুয়েজ যা আপনি যা করতে চান তা করতে পারেন। যে কারণে সিনট্যাক্স সংক্ষিপ্ত আকারে নাও হতে পারে। এর অংশ হ'ল নম্পি / স্কিপিতে আলাদা ডিজাইন, তবে এর অংশটি পাইথনের কেবলমাত্র মডুলার সেট আপ। আর দুর্দান্ত হয় যদি আপনার কেবল গণনা এবং গ্রাফিক্স করতে হয় তবে আপনি যদি কিছু ব্র্যাটার অ্যাপ্লিকটিয়নে এই কম্পিউটিশনগুলি ব্যবহার করতে চান তবে আপনি পাইথনের মতো কিছু পেতে চাইতে পারেন। তবে, আপনি পাইথন থেকে আর ব্যবহার করতে পারেন ...
জাস্টিন পিল

10
1619 ইস্যু প্রতি 0.11.0 তে স্কিপি-তে একটি set_bandwidthপদ্ধতি এবং bw_methodকনস্ট্রাক্টর যুক্তি যুক্ত করা হয়েছিল
এডিজিক

1
পুরানো উত্তর। নীচে সিবর্ন দ্রবণটি দেখুন, যা পাইথনে এখন আরও প্রমিত।
লুডভিগ

147

পাঁচ বছর পরে, যখন আমি গুগল "কীভাবে পাইথন ব্যবহার করে কার্নেলের ঘনত্বের প্লট তৈরি করব", এই থ্রেডটি এখনও শীর্ষে প্রদর্শিত হবে!

আজ, এটি করার একটি খুব সহজ উপায় হ'ল সিবর্ন , একটি প্যাকেজ যা অনেক সুবিধাজনক প্লটিং ফাংশন এবং ভাল স্টাইল পরিচালনা সরবরাহ করে।

import numpy as np
import seaborn as sns
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
sns.set_style('whitegrid')
sns.kdeplot(np.array(data), bw=0.5)

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


আপনাকে অনেক ধন্যবাদ .. দিন থেকে এই জাতীয় কিছু অনুসন্ধান করা হয়েছে .. আপনি প্লিজ ব্যাখ্যা করতে পারেন কেন bw=0.5দেওয়া হয়?
সিটজ ব্লগজ

4
@ সিটজব্লগজ bwপ্যারামিটারটি ব্যান্ডউইদথকে বোঝায়। আমি ওপির সেটিংটি মিলানোর চেষ্টা করছিলাম (তার মূল প্রথম কোড উদাহরণটি দেখুন)। কী bwনিয়ন্ত্রণ করে তার বিশদ ব্যাখ্যার জন্য , en.wikedia.org/wiki/… দেখুন । মূলত এটি নিয়ন্ত্রণ করে আপনি ঘনত্বের প্লটটি কতটা মসৃণ করতে চান। ডাব্লুডাব্লু যত বড় হবে তত বেশি মসৃণ হবে।
জিন

আমার অন্য প্রশ্নটি জিজ্ঞাসা করার জন্য আমার ডেটা প্রকৃতির স্বতন্ত্র এবং আমি তার জন্য পিডিএফ প্লট করার চেষ্টা করছি, স্কিপি ডকের মাধ্যমে পড়ার পরে আমি বুঝতে পেরেছিলাম যে পিএমএফ = পিডিএফ কীভাবে এটি প্লট করবেন সে সম্পর্কে কোনও পরামর্শ?
সিটজ ব্লগজ

1
আমি যখন এটি চেষ্টা করি তখন পাইTypeError: slice indices must be integers or None or have an __index__ method
এন্ডোলিথ

48

বিকল্প 1:

pandasডেটাফ্রেম প্লট ব্যবহার করুন (উপরে নির্মিত matplotlib):

import pandas as pd
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
pd.DataFrame(data).plot(kind='density') # or pd.Series()

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

বিকল্প 2:

ব্যবহার করুন distplotএর seaborn:

import seaborn as sns
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
sns.distplot(data, hist=False)

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


4
ব্যান্ডউইথ প্যারামিটার জুড়তে: df.plot.density (bw_method = 0.5)
Anake

3
@ আজিজের দরকার নেই pandas.DataFrame, pandas.Series(data).plot(kind='density')@ অ্যানাকে ব্যবহার করতে পারেন , আলাদা পদক্ষেপ হিসাবে df.plot.density সেট করার দরকার নেই; সবেমাত্র আপনার bw_methodকোয়ার্গে প্রবেশ করতে পারেনpd.Series(data).plot(kind='density', bw_method=0.5)
লাল মটর

45

সম্ভবত কিছু চেষ্টা করুন:

import matplotlib.pyplot as plt
import numpy
from scipy import stats
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
density = stats.kde.gaussian_kde(data)
x = numpy.arange(0., 8, .1)
plt.plot(x, density(x))
plt.show()

আপনি সহজেই gaussian_kde()কোনও আলাদা কার্নেল ঘনত্বের প্রাক্কলন দ্বারা প্রতিস্থাপন করতে পারেন ।


0

ঘনত্ব প্লটটি ম্যাটপ্ল্লোব ব্যবহার করে তৈরি করা যেতে পারে: ফাংশন plt.hist (ডেটা) ঘনত্বের প্লটের জন্য প্রয়োজনীয় y এবং x মান প্রদান করে (ডকুমেন্টেশন দেখুন https://matplotlib.org/3.1.1/api/_as_gen/ matplotlib.pyplot.hist.html )। ফলস্বরূপ, নিম্নলিখিত কোডটি ম্যাটপ্ল্লোব লাইব্রেরি ব্যবহার করে একটি ঘনত্বের প্লট তৈরি করে:

import matplotlib.pyplot as plt
dat=[-1,2,1,4,-5,3,6,1,2,1,2,5,6,5,6,2,2,2]
a=plt.hist(dat,density=True)
plt.close()
plt.figure()
plt.plot(a[1][1:],a[0])      

এই কোডটি নিম্নলিখিত ঘনত্বের প্লট প্রদান করে

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

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