2011-11-16 17 views
12

मान लीजिए ड्राइंग मैं n=2 साथ असतत वैक्टर की एक डेटा सेट:matplotlib में एक संबंध ग्राफ

DATA = [ 
    ('a', 4), 
    ('b', 5), 
    ('c', 5), 
    ('d', 4), 
    ('e', 2), 
    ('f', 5), 
] 

मैं matplotlib के साथ सेट है कि डेटा इतनी के रूप में दो चर के बीच किसी भी संबंध को कल्पना करने के लिए कैसे प्लॉट कर सकते हैं?

कोई भी सरल कोड उदाहरण महान होगा।

उत्तर

18

जो किंगटन का सही उत्तर है, लेकिन आपके DATA शायद अधिक जटिल है जो दर्शाया गया है। इसमें 'ए' पर कई मान हो सकते हैं। जो एक्स एक्स अक्ष मान बनाता है वह त्वरित है लेकिन केवल अद्वितीय मानों की सूची के लिए काम करेगा। ऐसा करने के एक तेज़ तरीका हो सकता है, लेकिन यह मैं इसे कैसे पूरा किया:

import matplotlib.pyplot as plt 

def assignIDs(list): 
    '''Take a list of strings, and for each unique value assign a number. 
    Returns a map for "unique-val"->id. 
    ''' 
    sortedList = sorted(list) 

    #taken from 
    #http://stackoverflow.com/questions/480214/how-do-you-remove-duplicates-from-a-list-in-python-whilst-preserving-order/480227#480227 
    seen = set() 
    seen_add = seen.add 
    uniqueList = [ x for x in sortedList if x not in seen and not seen_add(x)] 

    return dict(zip(uniqueList,range(len(uniqueList)))) 

def plotData(inData,color): 
    x,y = zip(*inData) 

    xMap = assignIDs(x) 
    xAsInts = [xMap[i] for i in x] 


    plt.scatter(xAsInts,y,color=color) 
    plt.xticks(xMap.values(),xMap.keys()) 


DATA = [ 
    ('a', 4), 
    ('b', 5), 
    ('c', 5), 
    ('d', 4), 
    ('e', 2), 
    ('f', 5), 
] 


DATA2 = [ 
    ('a', 3), 
    ('b', 4), 
    ('c', 4), 
    ('d', 3), 
    ('e', 1), 
    ('f', 4), 
    ('a', 5), 
    ('b', 7), 
    ('c', 7), 
    ('d', 6), 
    ('e', 4), 
    ('f', 7), 
] 

plotData(DATA,'blue') 
plotData(DATA2,'red') 

plt.gcf().savefig("correlation.png") 

मेरे DATA2 सेट हर एक्स अक्ष मूल्य के लिए दो मान होते हैं। यह नीचे लाल रंग में साजिश रची है: enter image description here

संपादित

सवाल आपसे पूछा बहुत व्यापक है। मैंने 'सहसंबंध' की खोज की, और Wikipedia ने पियरसन के उत्पाद-पल गुणांक पर अच्छी चर्चा की, जो एक रैखिक फिट की ढलान को दर्शाता है। ध्यान रखें कि यह मान केवल एक गाइड है, और किसी भी तरह से भविष्यवाणी नहीं करता है कि रैखिक फिट उचित धारणा है या नहीं, उपरोक्त पृष्ठ में correlation and linearity पर नोट्स देखें।

import matplotlib.pyplot as plt 
import numpy as np 

def plotData(inData,color): 
    x,y = zip(*inData) 

    xMap = assignIDs(x) 
    xAsInts = np.array([xMap[i] for i in x]) 

    pearR = np.corrcoef(xAsInts,y)[1,0] 
    # least squares from: 
    # http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.lstsq.html 
    A = np.vstack([xAsInts,np.ones(len(xAsInts))]).T 
    m,c = np.linalg.lstsq(A,np.array(y))[0] 

    plt.scatter(xAsInts,y,label='Data '+color,color=color) 
    plt.plot(xAsInts,xAsInts*m+c,color=color, 
      label="Fit %6s, r = %6.2e"%(color,pearR)) 
    plt.xticks(xMap.values(),xMap.keys()) 
    plt.legend(loc=3) 

नया आंकड़ा है: enter image description here

इसके अलावा प्रत्येक दिशा सपाट और व्यक्तिगत वितरण को देख सकता है यहाँ एक अद्यतन plotData विधि है, जो numpy.linalg.lstsq और का उपयोग करता है रेखीय प्रतीपगमन करने के लिए numpy.corrcoef पियर्सन की आर गणना करने के लिए है उपयोगी हो, और उनके doing this in matplotlib के उदाहरण हैं: enter image description here

यदि रैखिक अनुमान उपयोगी है, तो आप गुणात्मक निर्धारित कर सकते हैं बस फिट पर देखकर ly, आप y दिशा की flatting से पहले इस प्रवृत्ति को घटाना चाहते हैं। यह दिखाने में मदद करेगा कि आपके पास एक रैखिक प्रवृत्ति के बारे में गॉसियन यादृच्छिक वितरण है।

+0

हाय यान .. लिपि के लिए धन्यवाद। मैं अद्वितीय सूची भाग के बारे में नहीं समझा। आप बस फ्लोटिंग पॉइंट मानों को पूर्णांक में परिवर्तित कर रहे हैं। एक्स-अक्ष में अभी भी डुप्लिकेट मान हैं? – mdasari

5

मैं थोड़ा उलझन में हूं ... उन पंक्तियों के साथ कुछ करने के कई तरीके हैं। दिमाग में आने वाले पहले दो एक साधारण स्टेम प्लॉट या स्कैटर प्लॉट हैं।

क्या आप इस तरह की स्टेम प्लॉट का उपयोग करके चीजों को साजिश करना चाहते हैं?

import matplotlib.pyplot as plt 
data = [ 
    ('a', 4), 
    ('b', 5), 
    ('c', 5), 
    ('d', 4), 
    ('e', 2), 
    ('f', 5), 
] 
labels, y = zip(*data) 

x = range(len(y)) 
plt.stem(x, y) 
plt.xticks(x, labels) 
plt.axis([-1, 6, 0, 6]) 
plt.show() 

enter image description here

या इस तरह की एक बिखराव साजिश:

import matplotlib.pyplot as plt 
data = [ 
    ('a', 4), 
    ('b', 5), 
    ('c', 5), 
    ('d', 4), 
    ('e', 2), 
    ('f', 5), 
] 
labels, y = zip(*data) 

x = range(len(y)) 
plt.plot(x, y, 'o') 
plt.xticks(x, labels) 
plt.axis([-1, 6, 0, 6]) 
plt.show() 

enter image description here

या कोई अन्य विषय?