2016-07-06 15 views
2

同じ構造であるがY値が異なる複数の散布図グラフをggplotに作成しようとしています。後のステップでgrid_arrangeを使用して、グラフのさまざまな組み合わせを1つのレイアウトに配置するため、それらを別々にする必要があります(したがって、facet_wrapを使用しないでください)。ループを使って異なるY軸値を持つggplotに複数のプロットを作成する

このため、プロットするy値を反映する新しいプロット名を作成する必要があります。以下はサンプルコードです。月はx軸上の変数で、3つの追加変数(lag1_var、lag3_var、lag9_var)に対して3つの別々のプロットが必要です。

df <- data.frame (month= c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), 
       lag1_var= c (10, 20, 30, 40, 10, 40, 30, 50, 70, 90, 100, 100), 
       lag3_var= c(90, 70, 50, 40, 70, 50, 20, 50, 70, 90, 10, 10), 
       lag9_var = c(50, 20,90, 100, 90, 10, 40, 90, 100, 20, 30, 70)) 

私のアプローチは、以下のような、そのリスト上のy値とループ間で異なる値のリストを作成することでした。

loop.list <- c("1", "3", "9") 

for (val in loop.list) { 

    yval<- paste0("lag", val, "_var") 

    ptitle <-paste0("graph plot lag", val, "_Var") 

    assign(paste0("plot", val), ggplot(data=df, aes(x=month, y=get(yval))) 

+geom_point(color="red", size=2) + ggtitle(ptitle)) 

    } 

私はこれを行うとき、私は3と3つのプロットを取得しますプロット1はタイトル「グラフプロットlag1」を有し、プロット3はタイトル「グラフプロットlag3」などを有するが、それらは全て同一のプロットである。ループはプロット名とプロットタイトルのために働いていますが、y値は使用していません。最後のループ(変数lag9_varの場合)から値を出力するだけです。

なぜこのようなことが起こっているのか、それがなぜY値にのみ発生し、タイトルやプロット名ではないのかわかりません。私はいつもSASでプログラミングしていますし、Rには新しいので、SASの見込み客からこれを「R」の方法で考えるのではなく、アプローチしていると思います。

注:上記のコードでは、ggplotステートメントの外側にオブジェクト "yval"と "ptitle"を作成しますが、これはトラブルシューティングに役立ちます。私は以下のようなggplot文の中でそれらを含める場合、同じことが起こります:

for (val in loop.list) { 

     assign(paste0("plot", val), ggplot(data=df,aes(x=month,y=get(paste0("lag", val, "_var")))) + 

    geom_point(color="red", size=2) + 

    ggtitle(paste0("graph plot lag", val, "_Var"))) 

     } 

は、任意の助けをありがとう!

答えて

1

私はあなたが持っている問題は、各プロットを表示するために呼び出すときに各プロットを再構築しようとしている可能性があり、各プロットが作成されたときに与えられた参照ではなく、私はそれを完全に理解していないので、他の誰かがその主題を照らすことができれば素晴らしいだろう。

どちらにしても、その推論以下、私はそれが動作し、独自のデータフレームに各プロットのデータを分離しようとした、そして得ているように見える:grepコールがに列番号を見つけることです

library(data.table) 
library(ggplot2) 
loop.list <- c("1", "3", "9") 
for (val in loop.list) { 
    col <- grep(paste0("lag", val, "_var"), colnames(df)) 
    yval <- df[,c(1,col)] 
    setnames(yval, c("month", "var")) 
    frameval <- paste0("frame", val) 
    assign(paste0("frame", val), yval) 
    ptitle <-paste0("graph plot lag", val, "_Var") 

    plotval <- ggplot(data = get(frameval), aes(x=month,y=var)) + 
      geom_point(color="red", size=2) + 
       ggtitle(ptitle) 
    assign(paste0("plot",val), plotval) 
} 

お知らせそのプロットに対して使用し、残りの列をそのデータフレームとして列を切り離します。

ggplotが使用した方法ではうまくいかない理由を説明することはできませんが、これは回避策のようです。

0

上記のコードは、setNamesではなく names(yval)<-c("month", "var")の1回の変更で動作します。何らかの理由でsetNamesが機能しないので、各フレームの変数名がlag3_var、lag6_var、およびlag9_varだったので、ggplotステートメントにプロットするy値はありませんでした。ありがとうございました!!!

library(data.table) 
library(ggplot2) 
loop.list <- c("1", "3", "9") 
for (val in loop.list) { 
    col <- grep(paste0("lag", val, "_var"), colnames(df)) 
    yval <- df[,c(1,col)] 
    **names(yval)<- c("month", "var")** 
    frameval <- paste0("frame", val) 
    assign(paste0("frame", val), yval) 
    ptitle <-paste0("graph plot lag", val, "_Var") 

    plotval <- ggplot(data = get(frameval), aes(x=month,y=var)) + 
      geom_point(color="red", size=2) + 
       ggtitle(ptitle) 
    assign(paste0("plot",val), plotval) 
} 
+0

'setnames'(大文字)は' data.table'関数なので、パッケージを添付すればうまくいくでしょうか?私は 'data.table'をたくさん使っていますので、その関数を使うのに慣れています。 – rosscova

+0

ああ、意味がある、私はちょうどdata.tableを発見したので、まだすべての機能に精通していない。ありがとう! – Ninarjoyce

+0

あなたは大歓迎です。あなたの問題が解決した場合は、その答えを受け入れることを忘れないでください。他の人が必要な場合にそれを見つけることができます。 – rosscova

0

以下のコードは、「multiplotの()」関数を使用して、ソースがここで提供されていることを行う方法を示していますhttp://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2)

plotAllCounts <- function (dt){ 
    plots <- list(); 
    for(i in 1:ncol(dt)) { 
    strX = names(dt)[i] 
    print(sprintf("%i: strX = %s", i, strX)) 
    plots[[i]] <- ggplot(dt) + xlab(strX) + 
     geom_point(aes_string(strX),stat="count") 
    } 

    columnsToPlot <- floor(sqrt(ncol(dt))) 
    multiplot(plotlist = plots, cols = columnsToPlot) 
} 

今すぐ機能を実行する - のカウントを取得するには1つのページにggplotを使用して印刷するすべての変数:

dt = ggplot2::diamonds 
plotAllCounts(dt) 

これは、新しいデータセットを分析する際、私はいつも最初のステップの1つです。 あなたはそれが役に立つと思います。

注意しておきたいことは、ggplotを使用して通常ループ内で使用するaes(get(strX))を使用すると、上記のコードでaes_string(strX)の代わりに目的のプロットが描画されません。代わりに、最後のプロットを何度もプロットします。理由を理解していない - aesaes_stringggplotと呼びます。

関連する問題