当存在冗余级别时,如何在R的ggplot2中保持恒定宽度的条形图?

6
考虑一些样本数据,其中不存在水平:
dat <- data.frame(sex = c("F","M","F"),
                  status = c("Pregnant","Not pregnant","Not pregnant"),
                  frequency = c(25,100,75))

在样本数据中,男性无法怀孕,因此他们没有数据。
我想使用在R语言中使用以下代码使用ggplot2绘制数据:
library(ggplot2)

p <- ggplot(dat,aes(x=status,y=frequency,fill=sex))+
  geom_bar(stat = "identity",position="dodge")

print(p)

我得到了这样的输出:
如你所见,女性和怀孕的柱比其他柱更宽。我的问题是,如何抑制条形图的扩展以使所有柱的宽度相同?

4
如果您的样本数据是代表性的,那么仅添加频率为0的数据条目是否可行?这将保持相对列位置到横坐标轴标签。例如,如果您的数据集是 dat <- data.frame(sex = c("F","M","F","M"), status = c("Pregnant","Not pregnant","Not pregnant","Pregnant"), frequency = c(25,100,75,0)),那么您的绘图代码将按预期工作。 - Michael Bird
2个回答

7

2

在Michael Bird的评论中,补充一下,将零频行添加到您的数据框中可以解决此问题。

手动执行此操作可能很繁琐,因此我更喜欢使用tidyr库中的spreadgather

ggplot(dat %>% 
         tidyr::spread(sex, frequency, fill = 0) %>% 
         tidyr::gather(sex, frequency, -status),
       aes(x=status,y=frequency,fill=sex))+
  geom_bar(stat = "identity", position = "dodge")

这将为每个性别和状态的组合添加一个零频率的额外行。

欢迎来到SO。非常好的第一篇回答。 - Simon O'Hanlon
1
你可以使用tidyr中的dat %>% complete(sex, status, fill = list(frequency = 0))在一行完成。 - Brian

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