2013-04-13 6 views
13

का उपयोग करके ggplot में परतों को जोड़ने के लिए कैसे मैं ggplot2 में एक अलग परत पर डेटाफ्रेम के प्रत्येक कॉलम को प्लॉट करना चाहता हूं। परत दर परत साजिश का निर्माण अच्छी तरह से काम करता है:फॉर-लूप

df<-data.frame(x1=c(1:5),y1=c(2.0,5.4,7.1,4.6,5.0),y2=c(0.4,9.4,2.9,5.4,1.1),y3=c(2.4,6.6,8.1,5.6,6.3)) 

ggplot(data=df,aes(df[,1]))+geom_line(aes(y=df[,2]))+geom_line(aes(y=df[,3])) 

वहाँ एक भी समारोह का उपयोग करके लोगों पर उपलब्ध सभी कॉलम प्लॉट करने के लिए कोई तरीका है?

मैं इसे इस तरह से करने की कोशिश की, लेकिन यह काम नहीं करता है:

plotAllLayers<-function(df){ 
    p<-ggplot(data=df,aes(df[,1])) 
    for(i in seq(2:ncol(df))){ 
     p<-p+geom_line(aes(y=df[,i])) 
     } 
     return(p) 
    } 

plotAllLayers(df) 

उत्तर

13

एक दृष्टिकोण पुस्तकालय reshape2 से समारोह melt() का उपयोग कर लंबे प्रारूप करने के लिए विस्तृत प्रारूप से अपने डेटा फ्रेम नयी आकृति प्रदान करना होगा। नए डेटा फ्रेम में आपके पास x1 मान होंगे, variable जो निर्धारित करता है कि कौन से कॉलम डेटा आया था, और value जिसमें सभी मूल वाई मान शामिल हैं।

अब आप एक ggplot() और geom_line() कॉल के साथ सभी डेटा प्लॉट कर सकते हैं और variable का उपयोग प्रत्येक पंक्ति के लिए अलग रंग उदाहरण के लिए कर सकते हैं।

library(reshape2) 
df.long<-melt(df,id.vars="x1") 
head(df.long) 
    x1 variable value 
1 1  y1 2.0 
2 2  y1 5.4 
3 3  y1 7.1 
4 4  y1 4.6 
5 5  y1 5.0 
6 1  y2 0.4 
ggplot(df.long,aes(x1,value,color=variable))+geom_line() 

enter image description here

तुम सच के लिए() पाश (नहीं सबसे अच्छा तरीका है) तो आप seq() के बजाय names(df)[-1] का उपयोग करना चाहिए उपयोग करना चाहते हैं। इससे कॉलम नामों का वेक्टर बन जाएगा (पहले कॉलम को छोड़कर)। फिर geom_line() के अंदर उनके नाम से कॉलम चुनने के लिए aes_string(y=i) का उपयोग करें।

plotAllLayers<-function(df){ 
    p<-ggplot(data=df,aes(df[,1])) 
    for(i in names(df)[-1]){ 
    p<-p+geom_line(aes_string(y=i)) 
    } 
    return(p) 
} 

plotAllLayers(df) 

enter image description here

+0

धन्यवाद, यह मेरे प्रश्न का उत्तर देता है। यह वास्तव में मदद करता है। reshape2 बहुत उपयोगी है। मुझे लगता है कि मुझे लंबे प्रारूप में उपयोग करना होगा। – new2R

5

मैं एक बड़ी गंदा डेटासेट पर पिघल विधि की कोशिश की और एक तेजी से, क्लीनर विधि के लिए कामना की। यह लूप के लिए इच्छित प्लॉट बनाने के लिए eval() का उपयोग करता है।

fields <- names(df_normal) # index, var1, var2, var3, ... 

p <- ggplot(aes(x=index), data = df_normal) 
for (i in 2:length(fields)) { 
    loop_input = paste("geom_smooth(aes(y=",fields[i],",color='",fields[i],"'))", sep="") 
    p <- p + eval(parse(text=loop_input)) 
} 
p <- p + guides(color = guide_legend(title = "",)) 
p 

जब मैंने परीक्षण किया तो यह एक बहुत बड़ा पिघला हुआ डेटासेट चला गया।

मैंने aes_string (y = फ़ील्ड [i], रंग = फ़ील्ड [i]) विधि के साथ लूप के लिए भी कोशिश की, लेकिन रंगों को अलग-अलग नहीं किया जा सका।

+1

इस प्रश्न का एकमात्र उत्तर मैंने देखा है कि वास्तव में लूप और वास्तव में काम करता है। माना जाता है कि कई लोग कार्डिनल पाप 'eval' मानते हैं, लेकिन यह एक कारण के लिए मौजूद है: पी – ttbek