在ggplot2的geom_bar中去除条形之间的空格

6
我想要将一个条形图中的条形“躲避”在一起。以下是R代码,它会在条形之间留下空白。其他答案(如这个)展示了如何实现组内条形的这种效果,但似乎并不适用于x轴上每个因子的不同条形。
require(ggplot2)
dat <- data.frame(a=c("A", "B", "C"), b=c(0.71, 0.94, 0.85), d=c(32, 99, 18))

ggplot(dat, aes(x= a, y = b, fill=d, width = d/sum(d))) +
  geom_bar(position=position_dodge(width = 0.1), stat="identity")

调整宽度变量会改变外观,但似乎无法使条形图并排排列,同时保留它们在宽度上的有意义的差异(在这个图表中通过填充颜色冗余表示)。


1
问题可能是这会导致x轴断点之间的距离不均匀。 - erc
我会更进一步地说,由于距离不均匀,这是不可能的。在这种情况下,我会尝试使用 barplot() - ottlngr
@beetroot 这似乎是整个想法 - 你能控制因素在X轴上的位置吗? - Spacedman
@Spacedman 是的,我只是不确定这是否是一种良好的可视化数据的方式——在条形宽度中包含信息,给我一种饼图的感觉。 - erc
1
@beetroot -- 我同意你的观点,但有一个例外。宽度的变化确实违反了面积规则。然而,如果 x 轴宽度具有意义,则有一种论点认为它应该影响面积。条形图可以做到这一点(可能比这个解决方案更好),并在两个维度上提供有用的信息。我对这个特定示例有一种普遍的不良感觉;但是没有真实的用例,很难判断。我回答了可能的情况,而不一定是明智的情况。楼主:您可能希望编辑帖子并提供关于为什么要这样做的信息,以帮助未来的读者。 - Mark Peterson
也许ggmosaic包可以在众多选项中提供解决方案。请参见vignette以获取示例。 - Uwe
2个回答

7
我会生成x位置和宽度,然后将它们传递给aesthetics和override,以创建你的因子标签:
首先,存储宽度。
dat$width <-
  dat$d / sum(dat$d)

假设您的数据框已按照所需绘制的顺序排列,您可以将位置设置为宽度的累积和。但请注意,这个累积和是您想要柱形图的右边缘所在的位置,因此为了得到中心点,您需要减去一半的宽度:
dat$loc <-
  cumsum(dat$width) - dat$width/2

然后,将所有内容传递给ggplot调用,明确设置标签:

ggplot(dat, aes(x= loc, y = b, fill=d, width = width)) +
  geom_bar(stat="identity") +
  scale_x_continuous(breaks = dat$loc
                     , labels = dat$a)

提供

enter image description here

我不确定这种方法是否明智,但这应该能完成工作。

现在你的结果看起来好多了,因为你添加了一张图片 :-( 糟糕... :-) - drmariod
也许我应该加一张图片 :-) - drmariod
1
这并不是“快速”与“详尽”问题第一次(也不会是最后一次)被提出来了(元讨论)。两者都非常有用,但我个人倾向于添加叙述和细节以帮助未来的访问者理解代码。 - Mark Peterson
1
你说得对,我没想到会有人回答这个问题... :-) 在正常的工作流程中,我也会像你一样添加一个包含位置等信息的列,使整个标签和覆盖更加一致和可靠... - drmariod

5
使用连续的x轴并重新标记是可能的。
ggplot(dat, aes(x=cumsum(d/sum(d))) - d/sum(d)/2, y = b, fill=d, width=d/sum(d))) +
  geom_bar(stat="identity", position=position_dodge()) +
  scale_x_continuous(breaks=cumsum(dat$d/sum(dat$d)) - dat$d/sum(dat$d)/2, labels=dat$a)

或者这不是您正在寻找的东西吗?


我正在打字的时候你就抢先了。 - Mark Peterson

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