如何始终避开直方图?

13
使用ggplot2创建一个直方图,水平轴上使用因子,填充颜色使用另一个因子,并采用分离位置。我的问题是,填充因子有时对于水平因子的某个值只取一个值,由于没有任何东西可以躲避,所以条形图占据了整个宽度。是否有办法使其不躲避任何内容,以便所有条形图的宽度都相同?或者等效地绘制0的图表?
ggplot(data = mtcars, aes(x = factor(carb), fill = factor(gear))) +
geom_histogram(position = "dodge")

在此输入图片描述

这个回答 提供了一些想法。虽然该问题是在发布新版本之前提出的,但也许会有所变化?使用 facets(也可以在 这里 找到)不适合我的情况,尽管我想编辑数据并使用geom_bar 也能够解决问题,但感觉不够优雅。此外,当我试图使用facetting时

ggplot(mtcars, aes(x = factor(carb), fill = factor(gear))) +
    geom_bar() + facet_grid(~factor(carb))

我遇到了错误信息 "Error in layout_base(data, cols, drop = drop): At least one layer must contain all variables used for facetting"。

我想我可以生成一个计数的数据框,然后使用 geom_bar

mtcounts <- ddply(subset(mtcars, select = c("carb", "gear")),
    .fun = count, .variables = c("carb", "gear"))

在没有的级别上填充0。有人知道这是否有效或是否有更好的方法吗?


2
我知道你认为这不是理想的方式,但我认为预先计算数量并使用geom_bar是我首选的方法。 - joran
2个回答

12

更新:geom_bar需要stat = "identity"

我不确定这是否对您来说已经太晚,但请查看最近一篇帖子的答案here。也就是说,我建议采用Joran的建议,在ggplot调用之外预先计算计数,并使用geom_bar。与其他帖子的答案一样,计数分为两个步骤:首先使用dcast获取计数的交叉制表;然后第二步,melt交叉制表。

library(ggplot2)
library(reshape2)

dat = dcast(mtcars, factor(carb) ~ factor(gear), fun.aggregate = length)
dat.melt = melt(dat, id.vars = "factor(carb)", measure.vars = c("3", "4", "5"))
dat.melt

(p <- ggplot(dat.melt, aes(x = `factor(carb)`, y = value, fill = variable)) + 
  geom_bar(stat = "identity", position = "dodge"))

这张图表:

在此输入图片描述


能否附上最终结果的图片? - Roman Luštrik
我已经添加了图表,并进行了一些编辑更改以澄清回复。 - Sandy Muspratt
永远不会太晚!感谢将那个评论扩展为完整的答案。 - Gregor Thomas

0
此答案所示,在新版本的ggplot2(版本>= 2.2.1.900)中有一种更简单的方法:position_dodge增加了一个preserve参数,如果设置为"single",则始终会进行躲避。
ggplot(data = mtcars, aes(x = factor(carb), fill = factor(gear))) +
  geom_bar(position = position_dodge(preserve = "single"))

enter image description here


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