2016-08-09 7 views
-1

以下の関数は、渡されたデータからいくつかの密度をプロットすると、凡例をプロットしません。 MWE:あなたはaes内部美的(例えば、colourfill、など)にデータの列をマップするとき凡例がggplot2を使って複数の密度プロットをプロットしていない

plotDensities <- function(xlab="", xlim=c(), ...) { 
    datas <- list(...) 
    cbPalette <- c("#000000", "#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7") 
    if (length(datas) > length(cbPalette)) return(invisible(NULL)) 
    dplot <- ggplot() + xlab(xlab) + 
    scale_colour_manual(values=setNames(cbPalette[1:length(datas_names)], datas_names)) + 
    theme(legend.position = c(.8, .8)) 
    datas_names <- names(datas) 
    for (i in 1:length(datas)) { 
    name <- datas_names[i] 
    values <- data.frame(x=datas[[name]]) 
    dplot <- dplot + geom_density(aes(x=x), colour=cbPalette[i], data=values) 
    } 
    if (!is.null(xlim)) 
    dplot <- dplot + xlim(xlim) 

    return(invisible(dplot)) 
} 
v1 <- rnorm(2000, 0, 1) 
v2 <- rnorm(3000, 1, 1.5) 
v3 <- rnorm(4000, 2, 2.5) 
dplot <- plotDensities(xlim="whatever", v1=v1, v2=v2, v3=v3) 
dplot 

答えて

1

ggplotは、凡例を生成します。しかし、あなたのコードはgeom_densityへの電話でaesの外にcolourを設定しています。これは凡例を生成しません。

さらに、データは別々のベクトルに分割されます。ただし、ggplotは、「長い」形式の単一のデータフレームを持つ場合に最適です。この場合、v1,v2およびv3を単一のデータフレームに結合することを意味します。これは、各行がもともと出てきたベクトルを別の列でマークします。

は、ここでは、あなたの関数に適応させることができ、あなたのデータを使用して、簡単な例です:エレガント

# Convert data to long format 
dat = data.frame(vals=c(v1,v2,v3), 
       source=rep(c("v1","v2","v3"),sapply(list(v1,v2,v3), length))) 

dat 
  vals source 
1 -0.2860619  v1 
2  1.8072476  v1 
3 -0.6492385  v1 
... 
8998 3.8989335  v3 
8999 5.1929588  v3 
9000 1.8716558  v3 
ggplot(dat, aes(vals, colour=source)) + 
    geom_density() + 
    scale_colour_manual(values=cbPalette[1:length(unique(dat$source))]) 

enter image description here

+0

。適合しました。ありがとう。 :)他のstackoverflow質問[リンク](http://stackoverflow.com/questions/12199919/overlapped-density-plots-in-ggplot2)の受け入れられた答えから似たような何かが否定投票がなぜ取られたのか、 –

+0

うれしかった。私はダウン投票者ではないので、なぜ私は確信していません。 – eipi10

関連する問題