Reputation: 839
I understand that one can change the width of a bar in geom_bar
using the width
argument. That does work, but then it creates a larger gap between the bars. Is there a way to manually push the bars closer to together? Should I be manipulating the axis somehow instead?
Here is an example, changing width to 0.3 on the right to get the desired bar width.
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)
Note: I know this question is similar to this one, but the answer to closing the gap was not apparent.
How to change the space between bars in geom_bar?
Upvotes: 27
Views: 55949
Reputation: 41
I ended up trying to figure out this problem while attempting to compare two plots, one with many groups of bars and the other with only one group, so instead of presenting two graphs with bars of different width produced by
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
Which yields (note that the blue color on the legend apply to both graphs because I am filtering ds
in the second plot to only include individuals with Has.Large.Sepal == TRUE
)
I shrinked the second bar with the help of patchwork to make the bars' width similar in size to those of my previous plot
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())
Obtaining a more comparable pair of plots
Upvotes: 1
Reputation: 1697
Rather than taking the width smaller, which narrows the bars but increases the inter-bar space, set width = 1
to remove all space between.*
ggplot(iris, aes(Species, Petal.Length, fill=Species)) + geom_bar(stat="summary", width=1)
The default value is 0.9, so you can get very small spaces by setting width = 0.95
ggplot(iris, aes(Species, Petal.Length, fill=Species)) + geom_bar(stat="summary", width=0.95)
fill=Species
, I took the liberty of adding color to help see the different bars when there is no space between. Upvotes: 8
Reputation: 9573
I would adjust the plot's aspect ratio, and have ggplot
automatically assign the right width for the bars and the gap between them:
ggplot(iris, aes(Species, Petal.Length)) +
geom_bar(stat="summary", width=0.4) +
theme(aspect.ratio = 2/1)
Produces this:
Upvotes: 28