总是避开直方图的方法?

时间:2012-04-13 23:28:44

标签: r ggplot2

使用ggplot2我正在创建一个直方图,其中水平轴上有一个因子,另一个因素是填充颜色,使用躲闪位置。我的问题是填充因子有时只取一个值作为水平系数的值,并且没有任何东西可以躲避条占据整个宽度。有没有办法让它什么都不躲闪,所以所有的条宽都一样?或等效地绘制0?

例如

ggplot(data = mtcars, aes(x = factor(carb), fill = factor(gear))) +
geom_histogram(position = "dodge")

enter image description here

This answer有几个想法。在新版本发布之前也有人问过,所以也许有些事情发生了变化?使用facet(也显示为here)我不喜欢我的情况,虽然我想编辑数据并使用geom_bar可以工作,但感觉不够优雅。而且,当我尝试使用facetting时

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

我收到错误“layout_base中的错误(data,cols,drop = drop):   至少一个图层必须包含用于刻面“

的所有变量

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

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

填写0不存在的级别。有谁知道这是否有用或者有更好的方法吗?

2 个答案:

答案 0 :(得分:11)

已更新 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"))

图表:

enter image description here

答案 1 :(得分:0)

in this answer所示,在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