13

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

例如

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

在此处输入图像描述

这个答案有几个想法。在新版本发布之前也有人问过,所以也许有什么变化?使用方面(也显示在这里)我不喜欢我的情况,虽然我认为编辑数据和使用geom_bar可以工作,但感觉不优雅。此外,当我尝试刻面时

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

我收到错误“layout_base 中的错误(数据,cols,drop = drop):至少一层必须包含用于构面的所有变量”

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

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

用 0 填充不存在的级别。有谁知道这是否可行或是否有更好的方法?

4

2 回答 2

12

更新 geom_bar需求stat = "identity"

我不确定这对您来说是否为时已晚,但请参阅此处最近帖子的答案 也就是说,我会采纳 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"))

图表:

在此处输入图像描述

于 2012-04-28T01:34:41.687 回答
0

this answerggplot2所示,在(version >= 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"))

在此处输入图像描述

于 2019-02-13T14:25:19.453 回答