2016-10-17 13 views
0

データフレームごとに異なるグラフィックフレーム内の別のデータフレームのラインをプロットする必要があります。ほとんど同じコードとエース(color = "hard-coded-name")を使用して伝説を得ることができますが、私は事前に名前を知りません。私は、データフレームを単一のデータフレームにバインドするのに十分なRAMがありません。私は色付きの線でプロットを生成するサンプルを書いた。凡例を追加するにはどうすればいいですか?サンプルの場合と同様に、リスト内のデータフレーム数(ldf)やその名前について事前に知る必要はありません。入力データがリストデータフレームの場合、ggplotに紛失凡例を追加します。

library('ggplot2') 

f30 <- function() { 
    ############################################################### 
    ##### Create a list with a random number of data frames ####### 
    ##### The names of the list elements are "random"  ####### 
    ############################################################### 
    f1 <- function(i) { 
     b <- sample(1:10, sample(8:10, 1)) 
     a <- sample(1:100, length(b)) 
     data.frame(Before = b, After = a) 
    } 
    ldf <- sapply(1:sample(2:8,1), f1, simplify = FALSE) 
    names(ldf) <- LETTERS[sample(1:length(LETTERS), length(ldf))] 

    palette <- c(
     "#000000", "#E69F00", "#56B4E9", "#009E73", 
     "#F0E442", "#0072B2", "#D55E00", "#CC79A7" 
    ) 

    ############################################################### 
    ##### Above this point we're just creating a sample ldf ####### 
    ############################################################### 

    ePlot <- new.env(parent = emptyenv()) 
    fColorsButNoLegend <- function(ix) { 
     df <- ldf[[ix]] 
     n <- names(ldf)[ix] 
     if (ix == 1) { 
      ePlot$p <- ggplot(df, aes(x = Before, y = After)) + 
       geom_line(colour = palette[ix]) 
     } else { 
      ePlot$p <- ePlot$p + 
       geom_line(
        colour = palette[ix], 
        aes(x = Before, y = After), 
        df 
       ) 
     } 
    } 
    sapply(1:length(ldf), fColorsButNoLegend) 

    #Add the title and display the plot 
    a <- paste(names(ldf), collapse = ', ') 
    ePlot$p <- ePlot$p + 
     ggtitle(paste("Before and After:", a)) 
    ePlot$p 
} 
+1

lineplotは巨大data.framesを必要としません。あなたのdata.framesが大きすぎて結合することができない場合、それらはプロットに必要なものよりも大きくなります。サブサンプルを使用し、これらを結合する。 – Roland

+0

それは良い点です。実際には、これはメモリが制限されているため、不要なプレッシャーを加えたくない大きなアプリの一部に過ぎません。私はggplotの新機能です。私がラインプロットを使用する一般的なサブルーチンを書く場合は、サイズをチェックしサブサンプルを使用するコードを追加するのがよいでしょうか?どのような数のx点でサブサンプリングを開始したいのですか? –

+0

これはデータの性質によって異なります。スムーズなデータがあれば、より小さなサブサンプルを使用できます。ピークが多い非常に動的なデータがある場合は、より大きなサブサンプルが必要になることがあります。 – Roland

答えて

1

のは、一瞬のために、脇にあなたがRAM内に保持できるより多くのデータのラインプロットを作成する必要があるかどうかの問題を入れてみましょう。リストの要素には名前が付けられているので、それらの名前を事前に知らなくても、それらの名前を使用して色の凡例を生成することができます。

たとえば、以下のコードでは、データフレームに新しいsource列としてリスト要素の名前を追加し、そのsource列を色の美しさとして使用します。すると、ちょうどプロットを印刷する前に、私はあなたの色paletteに線の色を設定するためにscale_colour_manualステートメントを追加します。

ePlot <- new.env(parent = emptyenv()) 
    fColorsButNoLegend <- function(ix) { 
    df <- ldf[[ix]] 

    # Add name of list element as a new column 
    df$source = names(ldf)[ix] 

    if (ix == 1) { 
     ePlot$p <- ggplot(df, aes(x = Before, y = After, colour=source)) + 
     geom_line() 
    } else { 
     ePlot$p <- ePlot$p + 
     geom_line(
      aes(x = Before, y = After, colour=source), 
      df 
     ) 
    } 
    } 
    sapply(1:length(ldf), fColorsButNoLegend) 

    #Add the title and display the plot 
    a <- paste(names(ldf), collapse = ', ') 
    ePlot$p <- ePlot$p + 
    ggtitle(paste("Before and After:", a)) + 
    scale_colour_manual(values=palette) 
    ePlot$p 

ここでは関数からの出力例です:

f30() 

enter image description here

+0

お返事ありがとうございました。私が別の解決法を提供しているにもかかわらず、私が感謝していないとは思わないでください。 –

0

偶然、私は別のグラフパッケージが画面の不動産を節約する凡例の代替案を提供しているのを見て、列の追加やデータの複製よりも効率的だと思います。他の人が役に立つと思うかもしれないので、私はここにそれを提供すると思った。凡例情報をグラフそのものの空き領域に埋め込みます。 fAnnotate関数を参照してください - これは基本的なものですが、アイデアの微生物を提供するのに十分です。

enter image description here ライブラリー( 'ggplot2')

f30 <- function() { 
    ############################################################### 
    ##### Create a list with a random number of data frames ####### 
    ##### The names of the list elements are "random"  ####### 
    ############################################################### 
    f1 <- function(i) { 
    b <- sample(1:10, sample(8:10, 1)) 
    a <- sample(1:100, length(b)) 
    data.frame(Before = b, After = a) 
    } 
    ldf <- sapply(1:sample(2:8,1), f1, simplify = FALSE) 
    names(ldf) <- LETTERS[sample(1:length(LETTERS), length(ldf))] 

    palette <- c(
    "#000000", "#E69F00", "#56B4E9", "#009E73", 
    "#F0E442", "#0072B2", "#D55E00", "#CC79A7" 
) 

    ############################################################### 
    ##### Above this point we're just creating a sample ldf ####### 
    ############################################################### 

    ePlot <- new.env(parent = emptyenv()) 
    ePlot$xMin <- Inf 
    ePlot$xMax <- -Inf 
    ePlot$yMin <- Inf 
    ePlot$yMax <- -Inf 
    fColorsButNoLegend <- function(ix) { 
    df <- ldf[[ix]] 

    #Compute the boundaries of x and y 
    ePlot$xMin <- min(ePlot$xMin, min(df$Before)) 
    ePlot$xMax <- max(ePlot$xMax, max(df$Before)) 
    ePlot$yMin <- min(ePlot$yMin, min(df$After)) 
    ePlot$yMax <- max(ePlot$yMax, max(df$After)) 

    n <- names(ldf)[ix] 
    if (ix == 1) { 
     ePlot$p <- ggplot(df, aes(x = Before, y = After)) + 
     geom_line(colour = palette[ix]) 
    } else { 
     ePlot$p <- ePlot$p + 
     geom_line(
      colour = palette[ix], 
      aes(x = Before, y = After), 
      df 
     ) 
    } 
    } 
    sapply(1:length(ldf), fColorsButNoLegend) 

    #Divide by length+1 to leave room on either side of the labels 
    xGap <- (ePlot$xMax - ePlot$xMin)/(length(ldf) + 1) 
    fAnnotate <- function(ix) { 
    x <- ePlot$xMin + (ix * xGap) 
    lbl <- paste('---', names(ldf)[ix]) 
    b <- palette[ix] 
    ePlot$p <- ePlot$p + 
     annotate("text", x = x, y = -Inf, vjust = -1, label = lbl, colour = b) 
    } 
    sapply(1:length(ldf), fAnnotate) 

    #Add the title and display the plot 
    allNames <- paste(names(ldf), collapse = ', ') 
    ePlot$p <- ePlot$p + 
    ggtitle(paste("Before and After:", allNames)) 
    ePlot$p 
} 
関連する問題