【问题标题】:Width of bars in ggplot2 with many groupsggplot2中具有许多组的条形宽度
【发布时间】:2020-10-22 23:23:19
【问题描述】:

我试图重现 Roman 在这篇文章中给出的答案:The same width of the bars in geom_bar(position = "dodge") 但我无法解决我的问题。当条具有相同的宽度时,组之间的距离太大。当我使用facet_grid时同样的问题

我的 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"))

首先我尝试使用 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") 

然后我使用了 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")

即使条的宽度相等,组之间的距离也太大了。 我该怎么做才能解决这个问题?

【问题讨论】:

    标签: r ggplot2 width geom-bar


    【解决方案1】:

    也许试试这个。看起来问题出在position。如果您为条形定义position_dodge2(),您可以避免得到大条形。代码如下:

    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")
    

    输出:

    然而,原始代码产生了这个(使用position = "dodge"):

    【讨论】:

    • 这是我的问题。我想要与情节 2 相同的学科距离,但具有相同的宽度条。例如,在情节 1 中,我认为微生物学和海洋学之间的距离太大