【问题标题】:legend not plotting in multiple densities plot using ggplot2图例未使用 ggplot2 绘制多密度图
【发布时间】:2016-08-09 16:50:46
【问题描述】:

正如标题所说,下面的函数从传递的数据中绘制了一些密度,但没有绘制图例。 MWE:

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

【问题讨论】:

    标签: r plot ggplot2 legend


    【解决方案1】:

    当您将数据中的列映射到aes 中的美学(例如colourfill 等)时,ggplot 会生成一个图例。但是,您的代码在对geom_density 的调用中将colour 设置在aes 之外,这不会产生图例。

    此外,您的数据被拆分为单独的向量。但是,ggplot 在您有一个“长”格式的单个数据框时效果最好。在这种情况下,这意味着将v1v2v3 组合成一个数据框,另一列标记每行最初来自哪个向量。

    这是一个简单的例子,使用你的数据,你可以适应你的功能:

    # 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))])
    

    【讨论】:

    • 优雅。改编。谢谢。 :) - 不知道为什么投反对票,因为类似的东西取自另一个stackoverflow问题link的接受答案。
    • 很高兴工作。我不是反对者,所以我不知道为什么。
    猜你喜欢
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 2016-01-02
    • 2015-02-23
    • 1970-01-01
    相关资源
    最近更新 更多