2017-12-03 5 views
2

ビニング変数VAR2_BY_NS_BINとx-yデータペア(MP_BIN、)を持つテーブルがあります。私はbinnedのデータポイントをプロットし、stat_functionを使用して各ビンごとに異なる行を描画し、毎回for loopを使用して別の参照を取得します。複数のstat_functionをggplot2でオーバーレイできません

test_tab <- data.table(VAR2_BY_NS_BIN=c(0.0005478, 0.0005478, 0.002266, 0.002266, 0.006783, 0.006783, 0.020709, 0.020709, 0.142961, 0.142961), 
         MP_BIN=rep(c(0.505, 0.995), 5), 
         CORRECT_PROP=c(0.5082, 0.7496, 0.5024, 0.8627, 0.4878, 0.9368, 0.4979, 0.9826, 0.4811, 0.9989)) 

VAR2_BIN <- sort(unique(test_tab$VAR2_BY_NS_BIN)) #get unique bin values 
LEN_VAR2_BIN <- length(VAR2_BIN) #get number of bins 

col_base <- c("#FF0000", "#BB0033", "#880088", "#3300BB", "#0000FF") #mark bins with different colours 

p <- ggplot(data = test_tab) 

for (i in 1:LEN_VAR2_BIN) { 
    p <- p + geom_point(data = test_tab[test_tab$VAR2_BY_NS_BIN==VAR2_BIN[i],], 
         aes(x = MP_BIN, y = CORRECT_PROP), 
         col = col_base[i], 
         alpha = 0.5) + 
      stat_function(fun = function(t) {VAR2_BIN[i]*(t-0.5)+0.5}, col = col_base[i]) 
} 

p <- p + xlab("MP") + ylab("Observed proportion") 
print(p) 

上記コード(再現可能な例が)、しかし、常に(上記の場合に5行目で)描か最後stat_function線とプロットを返します。

for loopを使用せずに)次のコードで動作しますが、それは非常に現実的ではありませんので、私は実際に...事前に

p <- p + stat_function(fun = function(t) {VAR2_BIN[1]*(t-0.5)+0.5}, col = col_base[1]) 
p <- p + stat_function(fun = function(t) {VAR2_BIN[2]*(t-0.5)+0.5}, col = col_base[2]) 
p <- p + stat_function(fun = function(t) {VAR2_BIN[3]*(t-0.5)+0.5}, col = col_base[3]) 
p <- p + stat_function(fun = function(t) {VAR2_BIN[4]*(t-0.5)+0.5}, col = col_base[4]) 
p <- p + stat_function(fun = function(t) {VAR2_BIN[5]*(t-0.5)+0.5}, col = col_base[5]) 

感謝をビンの数が多いです!

答えて

2

forループやstat_functionは必要ありません。ポイントをプロットするには、MP_BINCORRECT_PROPをxとyにマッピングし、geom_pointを1回呼び出してプロットすることができます。ラインについては、必要な値をオンザフライで作成することができます(下のコードのように)。geom_lineでプロットします。あなたがのためのループを持った問題の観点から

library(tidyverse) 

ggplot(test_tab %>% mutate(model=VAR2_BY_NS_BIN*(MP_BIN - 0.5) + 0.5), 
     aes(x=MP_BIN, colour=factor(VAR2_BY_NS_BIN))) + 
    geom_point(aes(y=CORRECT_PROP)) + 
    geom_line(aes(y=model)) + 
    labs(colour="VAR2_BY_NS_BIN") + 
    guides(colour=guide_legend(reverse=TRUE)) 

、何が起こっているのは、あなたが、プロットを印刷するまでggplotが実際にループ変数(iを)評価しないということです。 iの値は、プロットが印刷されたときのループの最後に5であるため、取得する唯一の行です。この問題に関するいくつかの質問はスタックオーバーフローで見つけることができます。 Here's one of them

+0

ありがとう、このソリューションは私のために働く。自分の配色を定義する方法も尋ねてもいいですか? –

+1

'+ scale_fill_manual(値= c("赤 "、"青 "、"緑 "))'です。 n個の色のベクトル(この場合はn = 3)にするには 'values'だけ必要です。デフォルトは '+ scale_fill_manual(values = hcl(seq(15,375、length.out = 4)[1:3]、100、65))'と同じです。他のオプションについては、[こちらをご覧ください](http://ggplot2.tidyverse.org/reference/scale_brewer.html)をご覧ください。 – eipi10

関連する問題