ggplot2:非美学参数可以因子而异吗?

时间:2014-12-06 01:15:03

标签: r ggplot2

我想创建一个ggplot,其中统计参数根据美学映射因子而变化。具体来说,我想使用stat_density2d()创建一个等高线图,我想将离散因子映射到颜色,我想为每个因子级别指定不同的中断值。

这是一个最小的工作示例:

d <- data.frame(x=c(rnorm(500), rnorm(500, 2)), y=rnorm(1000), z=c(rep("a", 500), rep("b", 500)))

ggplot(d, aes(x, y, fill=z)) + 
      stat_density2d(breaks=.05, geom="polygon", alpha=.5)

enter image description here

这就是我想要的,除了各个因素的休息时间相同。我正在寻找一种方法来为每个因素指定不同的中断值。一种方法是为每个因素创建一个单独的层:

ggplot() + 
      stat_density2d(data=d[d$z=="a",], aes(x, y), breaks=.05, geom="polygon", alpha=.5, fill="red") +
      stat_density2d(data=d[d$z=="b",], aes(x, y), breaks=.1, geom="polygon", alpha=.5, fill="blue")

enter image description here

但这不可行,因为我失去了传说,对于超过两个因子水平的情况来说这太麻烦了。

我想结合上述两种情况的优势。我几乎是肯定的,我已经看到了一种方法来完成我正在尝试做的事情,但现在似乎无法找到它,因为它是相关的。有人对可能的解决方案有所了解吗?

1 个答案:

答案 0 :(得分:5)

几年前重写了这一点 - 所以直接从Kohske's answer

获取解决方案
# Data
set.seed(1)    
d <- data.frame(x=c(rnorm(500), rnorm(500, 2)), y=rnorm(1000), 
                                   z=c(rep("a", 500), rep("b", 500)))

library(plyr)
library(ggplot2)

hls <- mapply(function(x, b) stat_density2d(data = x, breaks = b, 
                    geom="polygon", alpha=.5), dlply(d, .(z)), c(0.05, 0.1))

ggplot(d, aes(x, y, fill=z)) + hls + scale_fill_manual(values=c("red", "blue"))

enter image description here

# Compare
ggplot() + 
  stat_density2d(data=d[d$z=="a",], aes(x, y), breaks=.05, geom="polygon", 
                                                      alpha=.5, fill="red") +
  stat_density2d(data=d[d$z=="b",], aes(x, y), breaks=.1, geom="polygon",
                                                     alpha=.5, fill="blue")