在 ggplot 的分面直方图中防止因素水平被删除

3

我正在使用ggplot(v1.0.1)绘制直方图,其中柱形填充映射到二进制状态因子State,并使用position = "dodge"。 直方图由第二个Group因子分面。 当一个State因子的级别在组中不存在时,该分面的图与同时存在两个级别的图不同。 以下是一个玩具示例:

set.seed(1234)
states <- c("Alive", "Dead")
dat <- data.frame(Group = rep(LETTERS[1:2], each=100), 
              Measure = rnorm(200, 50, 10),
              State = c(rep(states, 50), rep("Alive", 100)))

ggplot() +
  geom_histogram(data=dat, aes(x=Measure, fill=State), 
                 position="dodge", binwidth=5) +
  facet_wrap(~ Group)

从面B删除级别的默认行为

我希望组B的子图中的条形图与组A的相同,具有相同的宽度和相对位置。我认为 facet_wrap(~ Group, drop = FALSE) 可以实现这一点,但似乎没有任何效果。以下解决方法可以实现所需的绘图:

dat <- rbind(dat, data.frame(Group="B", Measure=50, State=NA))
ggplot() +
  geom_histogram(data=dat, aes(x=Measure, fill=State), 
                 position="dodge", binwidth=5) +
  scale_fill_discrete(na.value = NA) +
  facet_wrap(~ Group)

解决工作区以便在分面中具有相同的bin宽度和位置

但我相信一定有ggplot选项可以实现这一点,而不必对数据进行修改。


1
ggplot在绘制数据框中的数据方面通常非常出色,但我不确定是否应该将数据框调整得更符合你想要绘制的内容,这不是“操纵数据”的意思。tidyr提供了complete()函数来进行这样的转换。 - Gregor Thomas
从严格意义上讲,你的图表并不是一个直方图。我建议使用alpha透明度或另一个分面维度来替代position_dodge - Roland
@Gregor 谢谢你关于 tidyr 函数的提示 - michael
1个回答

4
简短的回答是不行;不幸的是,ggplot没有可实现此功能的选项,但有几种解决方法。
第一个和可能最简单的选择,您已经找到了,就是添加NA。
第二个选择是手动调整条形图的宽度,就像这个问题中第一个答案所示。
第三个选择来自建议@Roland: 不要 "dodge" 而是使用透明度:
ggplot() +
  geom_histogram(data=dat, aes(x=Measure, fill=State), 
                 position=position_identity(), binwidth=5, alpha=0.5) +
  facet_wrap(~ Group) +
  #change the colors and background, to improve visibility
  scale_fill_manual(values=c("red","blue")) +
  theme(panel.background = element_rect(fill = "transparent",colour = "black"))

将为您提供以下图表:

ggplot带透明度的直方图

个人认为它很丑陋。


非常感谢。Alpha选项对我也没有吸引力。 - michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接