2017-03-24 20 views
5

पर एनोटेट आउटलाइजर्स संयुक्त रूप से "टिप्स" डेटासेट को ग्राफ़िंग करते हुए, मैं ग्राफ पर शीर्ष 10 आउटलायर (या टॉप-एन आउटलायर) को अपने सूचकांक द्वारा "टिप्स" डेटाफ्रेम से लेबल करना चाहता हूं। मैं आउटलाइजर्स खोजने के लिए अवशिष्ट (औसत रेखा से एक बिंदु की दूरी) की गणना करता हूं। कृपया इस बाहरी पहचान विधि की योग्यताओं को अनदेखा करें। मैं बस spec के अनुसार ग्राफ एनोटेट करना चाहता हूँ।सीबर्न जोनप्लॉट

import seaborn as sns 
sns.set(style="darkgrid", color_codes=True) 

tips = sns.load_dataset("tips") 
model = pd.ols(y=tips.tip, x=tips.total_bill) 
tips['resid'] = model.resid 

#indices to annotate 
tips.sort_values(by=['resid'], ascending=[False]).head(5) 

enter image description here

tips.sort_values(by=['resid'], ascending=[False]).tail(5) 

enter image description here

%matplotlib inline 
g = sns.jointplot("total_bill", "tip", data=tips, kind="reg", 
        xlim=(0, 60), ylim=(0, 12), color="r", size=7) 

मैं प्रत्येक बिंदु के सूचकांक मूल्य से ग्राफ पर शीर्ष 10 बाहरी कारकों के कारण (सबसे बड़ा और सबसे छोटा 5 5 बच) (सबसे बड़ा बच कैसे व्याख्या करते) यह है:

enter image description here

उत्तर

4

आप किसी बिंदु पर एनोटेशन बनाने के लिए matplotlib annotate का उपयोग कर सकते हैं। विचार डेटाफ्रेम पर फिर से शुरू करना है और "tip" और "total_bill" कॉलम द्वारा दी गई संबंधित स्थिति पर एनोटेशन डालना है।

import pandas as pd 
import seaborn as sns 
import matplotlib.pyplot as plt 

sns.set(style="darkgrid", color_codes=True) 

tips = sns.load_dataset("tips") 
model = pd.ols(y=tips.tip, x=tips.total_bill) 
tips['resid'] = model.resid 

g = sns.jointplot("total_bill", "tip", data=tips, kind="reg", 
        xlim=(0, 60), ylim=(0, 12), color="r", size=7) 

#indices to annotate 
head = tips.sort_values(by=['resid'], ascending=[False]).head(5) 

tail = tips.sort_values(by=['resid'], ascending=[False]).tail(5) 

def ann(row): 
    ind = row[0] 
    r = row[1] 
    plt.gca().annotate(ind, xy=(r["total_bill"], r["tip"]), 
      xytext=(2,2) , textcoords ="offset points",) 

for row in head.iterrows(): 
    ann(row) 
for row in tail.iterrows(): 
    ann(row) 

plt.show() 

enter image description here


ध्यान दें कि पांडा संस्करण 0.20 pandas.ols has been removed के रूप में। इसे बदलने के लिए, statsmodels से OLS model का उपयोग कर सकते हैं। संबंधित लाइनों तो लिखा होगा:

import statsmodels.api as sm 
model = sm.OLS(tips.tip, tips.total_bill) 
tips['resid'] = model.fit().resid 

ध्यान दें कि परिणाम कुछ अलग (शायद अलग भार के कारण) है।

+0

पुनरावृत्ति और पुनरावृत्तियों को 'सिर' और 'पूंछ' को छंटनी करना पुनरावृत्ति की संख्या में कटौती करने का एक अच्छा तरीका था, मेरे वास्तविक डेटासेट जैसे बड़े डेटाफ्रेम के लिए esp। धन्यवाद –

+0

यह वास्तव में अच्छा है। अच्छा काम! – Charlie

+0

मैंने पांडा के नए संस्करणों के समाधान के साथ उत्तर अद्यतन किया। – ImportanceOfBeingErnest

संबंधित मुद्दे