使用ggplot2我正在创建一个直方图,其中水平轴上有一个因子,另一个因素是填充颜色,使用躲闪位置。我的问题是填充因子有时只取一个值作为水平系数的值,并且没有任何东西可以躲避条占据整个宽度。有没有办法让它什么都不躲闪,所以所有的条宽都一样?或等效地绘制0?
例如
ggplot(data = mtcars, aes(x = factor(carb), fill = factor(gear))) +
geom_histogram(position = "dodge")
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不存在的级别。有谁知道这是否有用或者有更好的方法吗?
答案 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"))
图表:
答案 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"))