Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Width of bars in ggplot2 with many groups

I tried to reproduce the answer given by Roman in this post: The same width of the bars in geom_bar(position = "dodge") but I couldnot fix my problem. When bars have the same width, the distance between the groups are too big. Same problem when I use facet_grid

My df:

df <- structure(list(discipline = structure(c(2L, 3L, 3L, 2L, 2L, 2L,  4L, 6L, 7L, 3L, 4L, 6L, 8L, 8L, 2L, 2L, 2L, 3L, 3L, 3L), .Label = c("", "Biogeochemistry", "Ecology", "Geochemistry", "Geography", "Management",  "Microbiology", "Oceanography"), class = "factor"), focus = structure(c(34L, 55L, 40L, 47L, 54L, 57L, 47L, 19L, 31L, 25L, 23L, 25L, 47L, 52L,13L, 20L, 23L, 16L, 26L, 27L), .Label = c("", "Abiotic measures", "Acidification", "Biogeochemichal budgets", "Biogeochemistry",  "Biogeochemistry, discharge", "Blue Carbon", "Chromophoric Dissolved organic matter, river plume", "Coastal anthromes", "Connectivity", "Coral reefs", "Ecology", "Ecosystem Function", "Ecosystem Services", "Embryo plants", "Fisheries", "Food webs", "Global change", "Governance", "Groundwater", "Hidrology", "Integrative Magamenet", "Isotopes", "Land-sea interactions","Land-sea interface", "Land use", "Life history", "Life traits", "Livelihoods", "Management", "Microbial community", "Modelling water quality",  "Nitrogen fluxes", "Nutrients", "Parasites", "ph, CO2", "Planning", "Pollutants", "Pollution", "Primary production", "Remote Sensing", "Resilience", "resilience, self-organization", "Restoration", 
"Salinization", "Sea level rise", "Sediment flux", "Sediments", "socio land-sea interactions", "Species interaction", "Submarine ground water", "Submarine groundwater", "Subsidies", "Trace metals", "Trophic interactions",  "Water quality", "Water resources"), class = "factor"), n = c(39L, 17L, 11L, 9L, 6L, 5L, 5L, 4L, 4L, 3L, 3L, 3L, 3L, 3L, 2L, 2L,  2L, 2L, 2L, 2L)), row.names = c(NA, -20L), class = c("tbl_df","tbl", "data.frame"))

First I tried with position = position_dodge2(preserve = "single")

ggplot(df, aes(x = (discipline), y = n, fill = reorder(focus, n))) + 
  geom_bar(position = position_dodge2(width = 0.9, preserve = "single"), stat = "identity") + ylab("N") + theme_classic() + geom_text(aes(label=focus), position = position_dodge2(width = 0.9, preserve = "single"), angle = 90, hjust = -0.1) + theme(legend.position = "none") 

enter image description here

Then I used facet_grid

ggplot(df, aes(x = (discipline), y = n, fill = reorder(focus, n))) + 
  geom_bar(position = "dodge", stat = "identity") + ylab("N") + theme_classic() + geom_text(aes(label=focus), position = position_dodge2(width = 0.9, preserve = "single"), angle = 90, hjust = -0.1) + theme(legend.position = "none") +  facet_grid(scales = "free_x", space = "free_x", switch = "x")

Even when width of bars are equal, distance between groups are too big. What can I do to solve this problem?

like image 297
Matías Avatar asked Nov 23 '25 07:11

Matías


1 Answers

Maybe try this. It looks like the issue is with position. If you define position_dodge2() for the bars you can avoid the big bars you got. Here the code:

library(ggplot2)
#Code
ggplot(df, aes(x = (discipline), y = n, fill = reorder(focus, n))) + 
  geom_bar(position = position_dodge2(0.9,preserve = 'single'),
           stat = "identity") + ylab("N") +
  theme_classic() + 
  geom_text(aes(label=focus), position = position_dodge2(width = 0.9, preserve = "single"),
            angle = 90, hjust = -0.1) + theme(legend.position = "none") +
  facet_grid(scales = "free_x", space = "free_x", switch = "x")

Output:

enter image description here

Whereas, the original code produces this (using position = "dodge"):

enter image description here

like image 92
Duck Avatar answered Nov 24 '25 20:11

Duck



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!