2013-11-21 5 views
10

का उपयोग कर एक sccatterplot में एक विश्वास एलिप्स को बनाना matplotlib का उपयोग कर एक sccatterplot में एक विश्वास एलिप्स बनाने के लिए कैसे?matplotlib

निम्नलिखित कोड स्कैटर प्लॉट बनाने तक काम करता है। फिर, क्या कोई भी डालने से परिचित है स्कैटर प्लॉट पर विश्वास इलिप्स?

import numpy as np 
import matplotlib.pyplot as plt 
x = [5,7,11,15,16,17,18] 
y = [8, 5, 8, 9, 17, 18, 25] 

plt.scatter(x,y) 
plt.show() 

एसएएस से विश्वास एलिप्स के संदर्भ में निम्नलिखित संदर्भ है।

http://support.sas.com/documentation/cdl/en/grstatproc/62603/HTML/default/viewer.htm#a003160800.htm

sas में कोड इस तरह है:

proc sgscatter data=sashelp.iris(where=(species="Versicolor")); 
    title "Versicolor Length and Width"; 
    compare y=(sepalwidth petalwidth) 
      x=(sepallength petallength) 
     /reg ellipse=(type=mean) spacing=4; 
run; 
+1

[बहुआयामी आत्मविश्वास अंतराल] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/12301071/multidimensional-confidence-intervals) –

+2

@ साल्लो कास्त्रो ने आपने सास में कोड देखा है और क्या आपको लगता है कि सास में लागू विधि और आपके द्वारा प्रदान किए गए लिंक में? – 2964502

+2

@ tester3 - उदाहरण के लिए आपने जो विश्वास किया है, उसमें विश्वास करने वाला आत्मविश्वास अंडाकार है, जैसा कि एक ही आबादी से निकाले गए एक और नमूने के विपरीत है। (यह वही है जो 'टाइप = माध्य' निर्दिष्ट कर रहा है।) मेरा जवाब है कि @ सोलो कैस्ट्रो से जुड़ा हुआ है, जो पूरी आबादी के लिए एक आत्मविश्वास दिखाता है (दूसरे शब्दों में, उस क्षेत्र में जहां जनसंख्या से एक और नमूना अंदर आना चाहिए, जैसा कि टाइप = एसएएस में भविष्यवाणी की गई)। जेमी का जवाब इस विधि का भी उपयोग करता है। –

उत्तर

14

निम्नलिखित कोड एक एक, दो, तीन और मानक विचलन आकार दीर्घवृत्त ड्रॉ:

x = [5,7,11,15,16,17,18] 
y = [8, 5, 8, 9, 17, 18, 25] 
cov = np.cov(x, y) 
lambda_, v = np.linalg.eig(cov) 
lambda_ = np.sqrt(lambda_) 
from matplotlib.patches import Ellipse 
import matplotlib.pyplot as plt 
ax = plt.subplot(111, aspect='equal') 
for j in xrange(1, 4): 
    ell = Ellipse(xy=(np.mean(x), np.mean(y)), 
        width=lambda_[0]*j*2, height=lambda_[1]*j*2, 
        angle=np.rad2deg(np.arccos(v[0, 0]))) 
    ell.set_facecolor('none') 
    ax.add_artist(ell) 
plt.scatter(x, y) 
plt.show() 

enter image description here

+1

@ जैमी - +1 क्या इलिप्स दो गुना चौड़ा और उच्च नहीं होना चाहिए, हालांकि? वर्तमान में, वे एन-सिग्मा चौड़े और उच्च हैं, क्योंकि इस क्षेत्र को एन-सिग्मा के भीतर क्षेत्र दिखाने का विरोध किया गया है। –

+0

@ जोकिंगटन हाँ, मुझे लगता है कि आप बिल्कुल सही हैं, matplotlib यह स्पष्ट करता है कि वे चौड़ाई और ऊंचाई हैं, अर्द्ध चौड़ाई और अर्ध-ऊंचाई नहीं ... कोड और छवि संपादित की है। धन्यवाद! – Jaime

+0

बेहतर @Ben का उत्तर नीचे जांचें, क्योंकि यह कोड कोण को ठीक से गणना नहीं करता है। यह मेरे मामले में लगभग 9 0 डिग्री फिसल गया। – grasshopper

12

स्वीकृत उत्तर देने के बाद, मैंने पाया कि मैं टी सही ढंग से वृत्त का चतुर्थ भाग का चयन नहीं करता है जब थीटा की गणना, के रूप में यह np.arccos पर निर्भर करता है:

oops

'possible duplicate' और Joe Kington's solution on github पर एक नज़र ले रहा है, मैं इस के लिए नीचे अपने कोड पानी पिलाया:

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.patches import Ellipse 

def eigsorted(cov): 
    vals, vecs = np.linalg.eigh(cov) 
    order = vals.argsort()[::-1] 
    return vals[order], vecs[:,order] 

x = [5,7,11,15,16,17,18] 
y = [25, 18, 17, 9, 8, 5, 8] 

nstd = 2 
ax = plt.subplot(111) 

cov = np.cov(x, y) 
vals, vecs = eigsorted(cov) 
theta = np.degrees(np.arctan2(*vecs[:,0][::-1])) 
w, h = 2 * nstd * np.sqrt(vals) 
ell = Ellipse(xy=(np.mean(x), np.mean(y)), 
       width=w, height=h, 
       angle=theta, color='black') 
ell.set_facecolor('none') 
ax.add_artist(ell) 
plt.scatter(x, y) 
plt.show() 

neg slope

+0

यह महान +1 काम करता है – grasshopper