ggplot2:如何通过geom_bar减少条形图的宽度和间距

25

我知道可以使用 geom_bar 中的 width 参数来改变柱形图中柱子的宽度。这的确有效,但是会在柱子之间产生更大的空隙。是否有一种方法可以手动将柱子推得更接近一些?我应该通过某种方式操纵坐标轴吗?

这里是一个例子,在右侧将宽度更改为0.3以获得所需的柱形图宽度。

library(tidyverse)
library(gridExtra)

p1 <- ggplot(iris, aes(Species, Petal.Length)) + geom_bar(stat="summary")
p2 <- ggplot(iris, aes(Species, Petal.Length)) + geom_bar(stat="summary", width=0.3)
grid.arrange(p1,p2,nrow=1)

注意:我知道这个问题与此问题类似,但关闭间隙的答案并不明显。

如何更改geom_bar中的条形之间的间距?

在此输入图片描述


你目前尝试了什么?也许,你想看一下这个帖子,学习如何提供可重现的示例。 - mnm
2
我尝试按照描述更改宽度。这里真的需要一个可重现的示例吗?这是关于ggplot2的基本功能的问题,而不是与我使用的任何代码特定相关的东西。 - Alex
听起来你想要减少x轴的总宽度。也许考虑使用p1 + coord_fixed(ratio = 0.02)这样的东西? - Z.Lin
@Alex,你看过这个帖子吗?它提到了position_dodge() - mnm
2
我不认为这是一个糟糕的问题 - 实际上,我还没有看到对此问题的满意回答。此外,随着可重现代码的添加,没有理由对这个问题进行负面评价。 - Dannid
3个回答

26

我想调整图形的长宽比,并让ggplot自动分配条形的正确宽度和它们之间的间隙:

  ggplot(iris, aes(Species, Petal.Length)) + 
      geom_bar(stat="summary", width=0.4) +
      theme(aspect.ratio = 2/1)

产生这个:

输入图像描述


5
不要将宽度缩小,这会使条形图变窄但增加条之间的空隙。相反,将width = 1设置为消除所有空隙。
ggplot(iris, aes(Species, Petal.Length, fill=Species)) + geom_bar(stat="summary", width=1)

enter image description here

默认值为0.9,因此通过将width = 0.95来获得非常小的间距。
ggplot(iris, aes(Species, Petal.Length, fill=Species)) + geom_bar(stat="summary", width=0.95)

enter image description here

  • 使用fill=Species参数,我添加了颜色来帮助区分不同的柱状图条形,当它们之间没有空隙时。

7
这并不是真正回答问题,因为原帖的意思是要具体缩小间隙大小,而不仅仅是用更宽的条形码来掩盖它们。 - Lamma
这对我今天很有帮助,谢谢。width=1非常方便。 - amrrs
@Lamma,问题似乎是要求将条形图更靠近一些。一个解释是想要更细的条。我提供了另一种解释,即只需去掉之间的空格。然而,我尚未找到同时实现两者(无间隙的细条)的方法。也许最终绘图需要进行一些缩放? - Dannid

0

我最终尝试解决这个问题,当我试图比较两个图形时,一个有许多组条形图,另一个只有一组,因此我不是呈现两个具有不同宽度的条形图,而是

library(patchwork)

ds <- iris %>% dplyr::mutate(Has.Large.Sepal = Sepal.Length > 5)

p1 <- ggplot(ds, aes(x = Species, y = Petal.Length, fill = Has.Large.Sepal)) +
      geom_bar(stat = "summary", position = "dodge")
p2 <- ggplot(ds %>% filter(Has.Large.Sepal == TRUE), aes(x = Species, y = Petal.Width)) + 
      geom_bar(stat = "summary", position = "dodge", fill = "#00BFC4")

p1 + p2

产生了以下结果(请注意,图例上的蓝色适用于两个图形,因为我在第二张图中使用Has.Large.Sepal == TRUE来过滤dsenter image description here

借助patchwork的帮助,我缩小了第二个柱状图,使其宽度与之前的绘图大小相似

p2 <- ggplot(ds %>% filter(Has.Large.Sepal == TRUE), aes(x = Species, y = Petal.Width)) + 
  geom_bar(stat = "summary", position = "dodge", fill = "#00BFC4", width = .95) + 
  theme(axis.text.x = element_text(angle = 90))

p1 + (p2 + plot_spacer())

获取一对更加可比较的绘图

enter image description here


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