在使用 stat='bin'、position='dodge' 并且存在零值的情况下,在 geom_bar 中留出空间

4
假设我正在绘制以下类型的数据:
x = data.frame(cat=c('a', 'a', 'a', 'b', 'b'), type=c('x', 'x', 'y', 'x', 'x'))
ggplot(x, aes(cat, fill=type)) + geom_bar(stat='bin', position='dodge')

这使我得到了一个如下的图表:

enter image description here

然而,我想让所有的条形图都有相同的宽度,这样当cat=='b'时会有一个空白的位置,蓝色条形图会在那里。我该怎么做?
2个回答

2
这可能是一个潜在的解决方案,虽然如果有更好的选择,我会很乐意听取。
ggplot(as.data.frame(table(x$cat, x$type)), aes(Var1, Freq, fill=Var2)) + geom_bar(stat='identity', position='dodge')

没问题,你还需要什么吗? - tonytonov
我希望有一种不需要通过table()的略微hacky的绕路的方法。 - Nils

1

没有简单的方法可以通过指定一些参数来使用stat_bin实现这一点:请参考this question。 适用于您情况的解决方案可能如下:

require(reshape2)
x_dcast <- dcast(x, type ~ cat, fun.agg = length)
x_melt <- melt(x_dcast, id.vars = "type")
ggplot(x_melt, aes(variable, value, fill=type)) + 
  geom_bar(stat='identity', position='dodge')

请注意,您的答案可能会被稍微修改:
ggplot(as.data.frame(table(x)), aes(Var1, Freq, fill=Var2)) + 
  geom_bar(stat='identity', position='dodge')

你可以看到,你的答案更加透明。无论如何,你都需要手动计算次数。
说到“有点hacky”——从我的经验来看,在R中非标准情况下这是一种常见的方法。如果它能够完成任务并且是可读的一行代码,为什么不呢?

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