【问题标题】:Shading (faceted) density plots between two points ggplot2两点ggplot2之间的阴影(多面)密度图
【发布时间】:2015-05-04 21:05:41
【问题描述】:

我正在尝试创建一个图,该图对两点之间的密度图曲线下的区域进行着色。到目前为止,这是我所拥有的:

df.ind <- data.frame(x=rnorm(1000))
df.group <- data.frame(group = factor(1:20))
df.group$gr.mean <- rnorm(20)
df.group$width <- 1 + abs(rnorm(20))
df.group$upper <- df.group$gr.mean + df.group$width
df.group$lower <- df.group$gr.mean - df.group$width

然后我可以创建一个ggplot,在其中使用来自df.indx 的密度并绘制20 个不同的时间(按每个组)。然后我覆盖垂直线。我想要做的是遮蔽线条之间的区域。

ggplot(df.group) + 
  stat_density(data=df.ind, mapping=aes(x), 
               geom="line", position="dodge") +
  facet_wrap(~group) + 
  geom_vline(aes(xintercept=lower)) +
  geom_vline(aes(xintercept=upper))

我在这里知道一个类似的问题:ggplot2 shade area under density curve by group 和这里:Shading a kernel density plot between two points.

但我的数据来自两个不同的data.frame 对象。因此,我不能使用他们用来聚合数据的巧妙技巧......

【问题讨论】:

  • 好吧,合并你的数据框并使用之前建议的方法。
  • @MrFlick - 不过没有什么可以合并的。它们没有任何共同特征。
  • 那么您需要为每个组重复单独的数据。或者您可以预先计算一次密度曲线并为每组重复该数据。 ggplot 不会进行任何特殊的多边形重叠检测。您需要计算要绘制的数据。
  • 谢谢。这样可行。不知道为什么我以前没有想到。

标签: r ggplot2


【解决方案1】:

就像我在 cmets 中提到的那样,您将不得不自己专门为每个面板创建数据。这是一种方法

# calculate density
dx<-density(df.ind$x)

#define areas for each group
mm <- do.call(rbind, Map(function(g, l,u) {
    data.frame(group=g, x=dx$x, y=dx$y, below=dx$x<l, above= dx$x > u)
}, df.group$group, df.group$lower, df.group$upper))

#plot data
p2<-ggplot(mm) + 
   geom_area(aes(x, y, fill=interaction(below,above))) + 
   geom_vline(data=df.group, aes(xintercept=lower)) +
   geom_vline(data=df.group, aes(xintercept=upper)) +
   facet_wrap(~group)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多