代码之家  ›  专栏  ›  技术社区  ›  Joep_S

geom_bar中的钢筋宽度不相等

  •  1
  • Joep_S  · 技术社区  · 7 年前

    ggplot

    df <- data.frame(Disease = c("Disease1","Disease2","Disease3","Disease3","Disease3","Disease4","Disease5","Disease5","Disease6","Disease4","Disease2","Disease2","Disease1","Disease7","Disease1","Disease1","Disease7","Disease6","Disease3","Disease6"),
                       Week = c(3,52,46,47,19,39,42,46,44,45,46,42,45,48,44,44,43,42,45,47),
                       Year = c(2015,2015,2015,2016,2015,2015,2016,2016,2015,2015,2015,2015,2016,2016,2016,2015,2016,2016,2016,2015),
                       Number = c(1,1,6,5,1,1,4,12,4,15,6,15,6,11,4,2,9,1,4,1))
    

    我使用下面的语法,它为我提供了几个条形图。

    ggplot(df, aes(factor(Week), Number )) + 
      geom_bar(stat="identity" , aes(fill = factor(Year)), position = "dodge") + 
      facet_wrap(~ Disease, ncol = 2, scales = "free_y") +
      labs(x = "Week", y = "Number") +
      scale_fill_discrete(name = "Year")
    

    enter image description here

    然而,我希望所有的酒吧有相同的宽度(见疾病1的宽度差异)。我已经在这里找到了答案 Bars in geom_bar have unwanted different widths when using facet_wrap 但在我的例子中,我无法做到这一点。有人能解决我的问题吗? 显然,我的原始数据集要大得多,不同条宽的问题比我上面的示例中更常见。

    2 回复  |  直到 7 年前
        1
  •  5
  •   Marius    7 年前

    您可以通过为每个疾病+周+年填写数据集来修复此问题:

    library(tidyverse)
    df2 = df %>%
        complete(Disease, Week, Year, fill = list(Number = 0))
    
    ggplot(df2, aes(factor(Week), Number )) + 
        geom_bar(stat="identity" , aes(fill = factor(Year)), position = "dodge") + 
        facet_wrap(~ Disease, ncol = 2, scales = "free_y") +
        labs(x = "Week", y = "Number") +
        scale_fill_discrete(name = "Year")
    

    你也可以尝试用0.1这样的小数字填充,这样你在每个x轴位置都会得到一些小条-我认为这有助于明确每个条都有一个空间,但你引入了潜在的混淆假值:

    df2 = df %>%
        complete(Disease, Week, Year, fill = list(Number = 0.1))
    
        2
  •  0
  •   Colin FAY    7 年前

    这很正常:在x轴上,每个单元在轴上有相同的空间(这里是1周)。

    有几个星期只有2015年,只有2016年,没有,或者两者都有。当有两个年份时,周单位与只有一年时相同。因此,当有两个年份需要绘制时,“单位空间”被分成两部分,因此条形图要小两倍。

    然后,“问题”不在facet\u包裹上,而是由于位置=“dodge”,这会将杆并排放置。

    科林