2017-09-05 6 views
0

可変数の引数からプロットを生成しようとしています。コードは正常に動作し、意図したプロットが生成されます。ただし、labels関数(fill = labels [i])は意図したとおりに機能しません。私はここで間違ったことを理解できません。すべてのラインは同じラベル「C 3」を有し、したがって同じ色を有する。ループを使用してggplot2にstat_functionプロットを追加する際に誤ったlablesを表示

library(ggplot2) 
F.Linear <- function(A, a, b, c) { 
    C <- (c - a*A)/b 
    C[C < 0] <- NA 
    return(C) 
} 

plot.linear.equations <- function(X, ...){ 
p <- ggplot(data.frame(x = X), aes(x = x)) 

    arguments <- list(...) 

    mycolors <- c("red", "blue", "green", "orange") 
    labels <- c("C 1", "C 2", "C 3", "C 4") 

    for(i in 1:length(arguments)){ 
    C <- unlist(arguments[i]) 
    p <- p + stat_function(fun=F.Linear, args = list(a=C[1], b=C[2], c=C[3]), geom="area", colour="black", alpha=0.2, aes(fill = labels[i])) 
    } 
    p <- p + scale_x_continuous(name = "A") + 
    scale_y_continuous(name = "C") + 
    scale_fill_manual("Constraints", values = c("red", "blue", "green", "orange")) 
return(p) 
} 

C1 <- c(12, 6, 20400) 
C2 <- c(9, 15, 25200) 
C3 <- c(6, 6, 12000) 


plot.linear.equations(c(0, 3000), C1, C2, C3) 

enter image description here

+2

[ggplot2:ループ内の行を追加し、カラーマッピングを保持する]の可能な重複(https://stackoverflow.com/questions/32698616/ggplot2-adding-lines-in-a-ループと保持の色マッピング) – aosmith

+0

問題は同じように見えますが、リンクされた質問(データに変数を追加するためにcbindを使用)でトリックを使用することはできませんでした。まだ解明しようとしている。 – max

+0

いいえ、これは私の正確なコードです。私はX $ labels =ラベル[1]を使っていませんでした。リンクされた例では、データ列を使用しましたが、stat_functionにはデータ列はありません。まだ解明しようとしている。ループの代わりに全体を書くと、うまくいきます。しかし、私はループがうまくいかない理由を理解したい。 – max

答えて

1

重複に示すように、データセットにラベルを移動するaesで遅延評価の問題を迂回します。

まず、関数内でデータセットを作成し、ループ内の適切なlabels値をデータセットの新しい変数として追加することでこれを行うことができます。 data引数のデータセットはstat_functionです。

plot.linear.equations <- function(X, ...){ 
    dat <- data.frame(x = X) 

    p <- ggplot(mapping = aes(x = X)) 

    arguments <- list(...) 

    mycolors <- c("red", "blue", "green", "orange") 
    labels <- c("C 1", "C 2", "C 3", "C 4") 

    for(i in 1:length(arguments)){ 
      dat$label <- labels[i] 
      C <- unlist(arguments[i]) 
      p <- p + stat_function(data = dat, fun=F.Linear, args = list(a=C[1], b=C[2], c=C[3]), geom="area", colour="black", alpha=0.2, aes(fill = label)) 
    } 

    p <- p + scale_x_continuous(name = "A") + 
      scale_y_continuous(name = "C") + 
      scale_fill_manual("Constraints", values = c("red", "blue", "green", "orange")) 
    return(p) 
} 

enter image description here

+0

驚くばかり!ありがとう! – max

関連する問題