我正在使用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的子图中的条形图与组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)
但我相信一定有ggplot选项可以实现这一点,而不必对数据进行修改。
ggplot
在绘制数据框中的数据方面通常非常出色,但我不确定是否应该将数据框调整得更符合你想要绘制的内容,这不是“操纵数据”的意思。tidyr
提供了complete()
函数来进行这样的转换。 - Gregor Thomasalpha
透明度或另一个分面维度来替代position_dodge
。 - Roland