मैटप्लोटलिब में घनत्व प्लाट कैसे बनाएं?


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स्कैपी से कक्षा का उपयोग कैसे किया जाता है , लेकिन आप देखेंगे कि यह बिल्कुल वैसा नहीं दिखता है जैसा आपने आर के साथ उत्पन्न किया था। यह इसलिए है क्योंकि 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()

मुझे मिला

वैकल्पिक शब्द

जो आप R से प्राप्त कर रहे हैं उसके बहुत करीब है। मैंने क्या किया है? अपने बैंडविड्थ की गणना करने के लिए gaussian_kde, एक परिवर्तनीय फ़ंक्शन का उपयोग करता है covariance_factor। फ़ंक्शन को बदलने से पहले, इस डेटा के लिए covariance_factor द्वारा लौटाया गया मान लगभग .5 था। इसको कम करने से बैंडविड्थ कम हुई। मुझे _compute_covarianceउस फ़ंक्शन को बदलने के बाद कॉल करना था ताकि सभी कारकों की सही गणना हो सके। यह आर से bw पैरामीटर के साथ एक सटीक पत्राचार नहीं है, लेकिन उम्मीद है कि यह आपको सही दिशा में लाने में मदद करता है।


6
@ जस्टिन नाइस जवाब (+1) और किसी भी पायथन वी आर फ्लेम वॉर्स या कुछ भी शुरू नहीं करना चाहता, लेकिन मैं जिस तरह से आर डेटा के साथ काम कर रहा हूं, वह बहुत ही प्यारे और अन्य भाषाओं के साथ प्यार करता है। मुझे यकीन है कि अजगर के पास आर पर बहुत सारे अच्छे अंक हैं (मैं अजगर उपयोगकर्ता नहीं हूं इसलिए मैं संभवतः टिप्पणी करने के लिए पूरी तरह से समान हूं) और डेटा का विश्लेषण करने की तुलना में बहुत अधिक काम के लिए इस्तेमाल किया जा सकता है, लेकिन लंबे समय तक आर के रूप में। उपयोगकर्ता मैं यह भूल जाता है कि इस तरह के कार्यों के लिए एक भाषा कितनी उपयुक्त है जब तक कि इस फसल की तरह उदाहरण नहीं हैं।
गैविन सिम्पसन

4
(अभी भी टिप्पणियों को संपादित करने के साथ लड़ना) यहाँ gaussian_kde का एक उपवर्ग है जो बैंडविड्थ को एक तर्क के रूप में सेट करने की अनुमति देता है और अधिक उदाहरण: mail.scipy.org/pipermail/scipy-user/2010-Janx/023877.html और एक वृद्धि है परियोजनाओं के टिकट । scipy.org/scipy/ticket/1092 नोट, gaussian_kde को n- आयामी डेटा के लिए डिज़ाइन किया गया है।
जोसेफ

11
@ गेविन सिम्पसन, हाँ, आर अधिक रसीला है क्योंकि इसमें एक संकीर्ण गुंजाइश है। यह सांख्यिकीय संगणना और ग्राफिक्स के लिए बनाया गया है। पायथन एक सामान्य प्रोग्रामिंग भाषा है जो आप जो भी करना चाहते हैं, वह बहुत अधिक कर सकते हैं। उसकी वजह से, वाक्य-विन्यास उतना सक्सेसफुल नहीं हो सकता। इसका एक हिस्सा Numpy / Scipy में एक अलग डिज़ाइन है, लेकिन इसका एक हिस्सा केवल पायथन पर मॉड्यूलर सेट-अप है। आर महान है यदि आपको केवल कम्प्यूटेशन और ग्राफिक्स करने की आवश्यकता है, लेकिन यदि आपको कुछ बहादुर ऐपेटॉइन में उन कंप्यूटर्स का उपयोग करने की आवश्यकता है, तो आप पायथन जैसे कुछ चाहते हैं। हालाँकि, आप आर का इस्तेमाल पायथन से भी कर सकते हैं ...
जस्टिन पील

10
एक set_bandwidthविधि और एक bw_methodकंस्ट्रक्टर तर्क को गॉस्पियन_केड में स्कैपी में जोड़ा गया था 0.11.0 प्रति अंक 1619
eddygeek

1
पुराना उत्तर। सीबॉर्न समाधान पर नीचे देखें, जो अब पायथन में अधिक मानक है।
लुडविग

148

पांच साल बाद, जब मैंने Google "अजगर का उपयोग करके एक कर्नेल घनत्व प्लॉट कैसे बनाया", यह धागा अभी भी शीर्ष पर दिखाता है!

आज, ऐसा करने का एक बहुत आसान तरीका सीबॉर्न का उपयोग करना है , एक पैकेज जो कई सुविधाजनक प्लॉटिंग फ़ंक्शन और अच्छी शैली प्रबंधन प्रदान करता है।

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)

यहां छवि विवरण दर्ज करें


बहुत बहुत धन्यवाद .. कुछ दिनों से इस तरह की खोज की जा रही है .. u pls बता सकता है कि क्यों bw=0.5दिया गया है?
Sitz Blogz

4
@SitzBlogz bwपैरामीटर बैंडविड्थ के लिए खड़ा है। मैं ओपी की सेटिंग का मिलान करने की कोशिश कर रहा था (उसका मूल पहला कोड उदाहरण देखें)। क्या bwनियंत्रण की एक विस्तृत व्याख्या के लिए , en.wikipedia.org/wiki/… देखें । मूल रूप से यह नियंत्रित करता है कि आप घनत्व को कितना सहज चाहते हैं। बीडब्ल्यू जितना बड़ा होगा, उतना ही चिकना होगा।
शिन

मेरे पास यह पूछने के लिए एक और क्वेरी है कि मेरा डेटा प्रकृति में असतत है और मैं इसके लिए पीडीएफ को प्लॉट करने की कोशिश कर रहा हूं, डरपोक डॉक्टर के माध्यम से पढ़ने के बाद मुझे समझ आया कि पीएमएफ = पीडीएफ इस पर कोई सुझाव है कि इसे कैसे प्लॉट किया जाए?
Sitz Blogz

1
जब मैं यह कोशिश मैंTypeError: slice indices must be integers or None or have an __index__ method
endolith

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.d घनत्व (bw_method = 0.5)
Anake

3
@ एज़ की जरूरत नहीं है pandas.DataFrame, pandas.Series(data).plot(kind='density')@ एनेक का उपयोग कर सकते हैं , एक अलग कदम के रूप में df.plot.d घनत्व सेट करने की आवश्यकता नहीं है; बस अपने bw_methodkwarg में पारित कर सकते हैं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

घनत्व प्लॉट को matplotlib का उपयोग करके भी बनाया जा सकता है: फ़ंक्शन plt.hist (डेटा) घनत्व प्लॉट के लिए आवश्यक y और x मान लौटाता है (दस्तावेज़ देखें https://matplotlib.org/3.1.1/api/_n_gen/ matplotlib.pyplot.hist.html )। परिणामस्वरूप, निम्न कोड matplotlib लाइब्रेरी का उपयोग करके एक घनत्व प्लॉट बनाता है:

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])      

यह कोड निम्नलिखित घनत्व प्लॉट देता है

यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.