2013-04-13 22 views
13

データフレームの各列をggplot2の別のレイヤにプロットしたいと思います。層によってプロット層を構築 はうまく機能:forループを使ってggplotにレイヤーを追加する方法

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と、すべて元のy値を含むvalueとなります。

ggplot()geom_line()コールですべてのデータをプロットすることができ、たとえば、それぞれの行に別々の色を使用するにはを使用します。

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

あなたは本当に、あなたはnames(df)[-1]代わりのseq()を使用する必要があります()ループ(ない最良の方法)に使用する場合。これは、列名のベクトルを作成します(最初の列を除く)。 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

私は、大規模なデータセット乱雑に溶融法を試してみましたが、より速く、クリーンな方法を望みました。このforループは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 = fields [i]、color = fields [i])メソッドでforループを試しましたが、色を区別することができませんでした。

+1

この質問に対する唯一の答えは、実際には実際にはループしていることです。多くの人が枢機卿の罪を「評価」すると考えているが、それは理由のために存在する:P – ttbek

関連する問題