【问题标题】:combining multiple ggplot geom into one figure将多个ggplot geom组合成一个图形
【发布时间】:2019-02-06 13:48:34
【问题描述】:

我可以生成以下两个图形,但无法弄清楚如何将它们组合成一个图形,其中条形堆叠在“地毯”上方堆叠的密度之上:

bars <- data.frame( start=c(1,34,67,98), stop=c(34,67,98,125), label=c(1,2,1,3) )
points <- data.frame( x=c(16,29,37,52,58,68,77,89,103,114) )
ggplot(bars, aes(xmin = start, xmax = stop, ymin=label-1, ymax=label, fill=label)) + geom_rect()
ggplot(data=points, aes(x=x)) + geom_density() + geom_rug()

我尝试过类似的方法:

    ggplot(bars, aes(xmin = start, xmax = stop, ymin=label-1, ymax=label, fill=label)) + 
 geom_rect() + 
    geom_density(data=points, aes(x=x)) + 
    geom_rug(data=points, aes(x=x))

但似乎后来的 geom_X 调用弄乱了第一个调用:

FUN(X[[i]], ...) 中的错误:找不到对象“标签”

【问题讨论】:

  • 你能添加显示当前和预期输出的图片吗?
  • 关于如何使用 ggplot2 在直方图上放置密度图的问题已被多次询问和回答。你有没有做过任何搜索。其他问题和答案有什么问题?

标签: r ggplot2


【解决方案1】:

您在绘图的每个部分都有不同的变量映射到 xy。因此,您必须将aes() 规范从原始ggplot() 调用中提取出来(这使其适用于所有geom),而是为每个geom 指定不同的参数。然后你必须指定每个geom 应该使用哪些数据。比如:

ggplot(bars) + 
    geom_density(data = points, aes(x = x, y = stat(scaled))) + 
    geom_rug(data = points, aes(x = x)) +
    # Will use the default bars data
    geom_rect(aes(xmin = start, xmax = stop, ymin=label-1, ymax=label, fill=label))

【讨论】:

  • 尽管我在 ggplot 上进行了所有阅读,但我从未了解过在 ggplot() 调用中指定 aes() 是如何强制它适用于所有几何图形的!谢谢你的澄清!作为一个 lagniappe,有没有办法将轴比例命令链接到特定的几何图形。如所写,密度和条形重叠。我发现了一些“kluge”修复,但没有什么优雅的(即正确的方法)。再次感谢!
【解决方案2】:

这有帮助吗?

    ggplot(bars, aes(xmin = start, xmax = stop, ymin=label-1, ymax=label, fill=label)) + 
      geom_rect()+
      geom_rug(data=points, aes(x=x),inherit.aes = F)+
      geom_density(data=points,aes(x=x,y=stat(scaled)),inherit.aes = F)
 #need a y argument in geom_density. 
#This is from @Marius' answer. Aim is to show inherit.aes usage

【讨论】:

    【解决方案3】:

    这行得通吗:

    bars <- data.frame( start=c(1,34,67,98), stop=c(34,67,98,125), label=c(1,2,1,3) )
    points <- data.frame( x=c(16,29,37,52,58,68,77,89,103,114) )
    points2<- data.frame(x=density(points$x)$x,y= density(points$x)$y * max(bars$label)*100)
    ggplot()+  geom_rect(data = bars, aes(xmin = start, xmax = stop, ymin=label-1, ymax=label, fill=label)) +
      geom_line(data = points2,aes(x=x,y=y))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 2014-04-26
      • 2019-04-09
      • 1970-01-01
      相关资源
      最近更新 更多