2015-10-29 7 views
6

मेरे पास एक पांडा डेटाफ्रेम में संग्रहीत डेटा का एक सेट है। मैं कनेक्टेड पॉइंट्स के साथ एक बहु-श्रृंखला स्कैटर प्लॉट बनाने के लिए सीबर्न के प्वाइंटप्लॉट() का उपयोग करने की कोशिश कर रहा हूं। प्रत्येक श्रृंखला में अलग-अलग (x, y) मान होते हैं, और वे मेरे डेटा फ्रेम में फ्लोट के रूप में संग्रहीत होते हैं। प्रत्येक पंक्ति में एक लेबल होता है, जो प्रत्येक श्रृंखला को अलग करता है। मैं पायथन 2.7, समुद्री संस्करण 0.5.1, और matplotlib संस्करण 1.4.3 का उपयोग कर रहा हूँ।समुद्री डाकू का उपयोग कर जुड़े बिंदुओं के साथ एकाधिक श्रृंखला स्कैटर प्लॉट कैसे बनाएं?

सब कुछ मैं खोजने के लिए प्रबंधित किया है मुझसे कहता है कि मैं निम्नलिखित के साथ इस लक्ष्य को हासिल कर सकते हैं:

import matplotlib.pyplot as plt 
import seaborn as sns 

# Suppose my dataframe is called 'df', with columns 'x', 'y', and 'label'. 
sns.pointplot(x = 'x', y = 'y', hue = 'label', data = df) 

बहरहाल, यह कुछ अजीब व्यवहार में परिणाम:

  • रंग सही ढंग से पहचान कर रहे हैं, लेकिन केवल अंक के जुड़े हुए हैं
  • एक्स-अक्ष ओवरलैप पर संख्याएं और ऐसा प्रतीत होता है जैसे प्रत्येक डेटा बिंदु को इसके मूल्य के साथ लेबल किया जा रहा है एन उचित, साफ मूल्यों के साथ इसे स्केल कर रहा है (ऐसा लगता है कि एक्स डेटा को फ्लोट के बजाए स्ट्रिंग/लेबल के रूप में माना जा रहा है)।

मैंने अपने डेटा फ्रेम को टुकड़ों में विभाजित करके इसके आसपास काम करने का प्रयास किया।

df1 = df[df.test_type.values == "label 1"] 
df2 = df[df.test_type.values == "label 2"] 

ax = sns.pointplot(x = 'x',y='y', color = "blue", data = df1) 
sns.pointplot(x = 'x', y = 'y', data = df2, color="red", ax = ax) 

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

अब, मैं कैसे सफाई से मेरी उत्पादन/भूखंडों पोस्ट करने के लिए यकीन नहीं है, लेकिन मेरी समस्याओं में से कुछ निम्नलिखित के साथ निर्मित किया जा सकता है:

#import the necessary modules 
import matplotlib.pyplot as plt 
import pandas as pd 
import seaborn as sns 

#Here is some sample data. The 'x2' data is slightly offset from 'x1' 
x1 = range(0,100,10) 
x2 = range(1,100,10) 
x = x1+x2 

#The y-values I generate here mimic the general shape of my actual data 
y1 = x1[::-1] 
y2 = [i+25 for i in x1[::-1]] 
y = y1+y2 

#Two levels of labels that will be applied to the data 
z1 = ["1"]*10 
z2 = ["2"]*10 
z = z1+z2 

#A pandas data frame from the above data 
df = pd.DataFrame({'x': x, 'y': y, 'z': z}) 

#Pointplot using the above data 
sns.pointplot(x = 'x', y = 'y', data = df, hue = 'z') 

निम्नलिखित में इस कोड परिणाम चल रहा है:

  • सभी श्रृंखलाओं में सभी एक्स मान समान रूप से स्थान पर हैं। ध्यान दें कि 'x2' मान 'x1' के रूप में 'x1' के समान हैं और वे प्रत्येक श्रृंखला के भीतर 10 के अंतराल पर हैं। मुझे इस व्यवहार की उम्मीद नहीं थी।
  • एक्स अक्ष में "साफ" दिखने वाला स्केल नहीं है। यह सचमुच प्रत्येक बिंदु के संबंधित एक्स-वैल्यू को लेबल करता है। यह अंक सही ढंग से लेबल करता है, लेकिन इसे उचित रूप से स्केल नहीं करता है। ऐसा लगता है कि यह एक्स मानों को लेबल्स के रूप में मान रहा है, जैसे कि बार ग्राफ कैसे व्यवहार कर सकता है।
  • अंक सही ढंग से रंगीन हैं, लेकिन कोई बिंदु जुड़े नहीं हैं।

    वहाँ एक आसान/बेहतर/अधिक सुरुचिपूर्ण एक पांडा डेटा फ्रेम में संग्रहीत डेटा का उपयोग कर कनेक्ट किए गए अंकों के साथ बहु-श्रृंखला बिखराव भूखंडों प्लॉट करने के लिए रास्ता नहीं है:

मेरे सवाल का संक्षेप में प्रस्तुत करना? Seaborn के पॉइंटप्लॉट आदर्श लग रहा था, लेकिन यह काम नहीं कर रहा है जैसा कि मैंने उम्मीद की थी और मुझे संदेह है कि यह एक उद्देश्य को पूरा करने के लिए जो मुझे पूरा करने की ज़रूरत है उससे अलग हो सकता है। मैं अन्य समाधानों के लिए खुला हूं जो इसे प्राप्त कर सकते हैं (अधिमानतः पायथन का उपयोग कर)।

अग्रिम धन्यवाद। अगर मैं अपने कोड से आउटपुट और प्लॉट अपलोड करने का तरीका समझ सकता हूं तो मैं अपना प्रश्न अपडेट कर दूंगा।

मैं स्टैक ओवरफ्लो में 100% नया हूं। मुझे अपने कोड द्वारा जेनरेट किए जा रहे प्लॉट पोस्ट करके मेरे प्रश्न को स्पष्ट करना अच्छा लगेगा, लेकिन मैं इसे समझ नहीं पाया। ऐसा करने के तरीके पर कोई भी संकेतक भी सराहना की जाएगी ताकि मैं प्रश्न अपडेट कर सकूं।

संपादित करें: ऐसा नहीं है कि Seaborn के pointplot जो अजीब व्यवहार मैं ऊपर उल्लेख किया है बताते हैं एक स्पष्ट अक्ष, के रूप में एक्स-अक्ष का उपयोग करता है पता चला है। एक्स-अक्ष व्यवहार को संख्यात्मक से संख्यात्मक रूप से मैन्युअल रूप से बदलने का कोई तरीका है? यह सबसे आसान दृष्टिकोण की तरह लगता है लेकिन मैं अजगर में ठीक-ट्यूनिंग प्लॉट से परिचित नहीं हूं।

+0

आपका कोड ठीक है, और नए उपयोगकर्ताओं के लिए चित्र एम्बेड करना अक्षम है। आप उन्हें imgur.com पर अपलोड कर सकते हैं और यूआरएल पोस्ट कर सकते हैं, कोई उन्हें प्रश्न में संपादित कर देगा। –

+0

मुझे लगता है कि आप बस 'plt.plot' – mwaskom

+0

का उपयोग करना चाहते हैं, मुझे लगता है कि यह सही दिशा है, लेकिन यह मुझे स्पष्ट नहीं है कि मैं एक ही श्रृंखला या समूह में मौजूद रंग/रंग कैसे जोड़ सकता हूं। मैं अब इस पर पढ़ने की कोशिश कर रहा हूं, लेकिन मुझे ऐसा स्रोत नहीं मिल रहा है जो plt.plot की कार्यक्षमता को विस्तार से समझा सकता है। –

उत्तर

4
@mwaskom और this question की मदद से

, मैं अपने पोस्ट प्रश्न के समाधान खोजने के लिए प्रबंधित किया है:

#Assuming df is a pandas data frame with columns 'x', 'y', and 'label' 
for key,grp in df.groupby('label'): 
    plt.plot(grp.x,grp.y,'o-',label = key) 
plt.legend(loc = 'best') 
3

मैं एक ऐसी ही समस्या थी और मैं अंत में Seaborn के FacetGrid का उपयोग कर इसे हल। मैंने बिंदुओं को जोड़ने वाली रेखाओं के लिए अंक और plt.plot के लिए plt.scatter का उपयोग किया।

g = sns.FacetGrid(df, hue="z", size=8) 
g.map(plt.scatter, "x", "y") 
g.map(plt.plot, "x", "y") 

Time series plots

ध्यान दें, इस संस्करण 0.5.1 में Seaborn संस्करण 0.6.0 में किया और नहीं है।

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