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

我如何按最大值来订购GEOMCOLCOL?

  •  0
  • unknown  · 技术社区  · 5 年前

    我有一些数据,我想按组的最高平均值排序,然后将它们绘制成一个堆叠的条形图。我已经成功地做到了这一点,通过产生几个数据框,但它是冗长的,我想知道是否有一个较少冗长的方式做这件事?

    set.seed(3)
       x <- rep(letters[1:5], 3)
    fill <- rep(letters[24:26], 5)
       n <- runif(15, 0, 1)
      df <- data.frame(x, fill, n)
    
    df2 <- df %>%
      group_by(x) %>%
      mutate(percent = n/sum(n))
    
    df3 <- df2 %>%
      group_by(fill) %>%
      summarise(mean = mean(percent))  %>%
      ungroup() %>%
      arrange(desc(mean))
    
    df3 <- df2[df2$fill == df3$fill[1], ] %>%
      arrange(desc(percent))
    df$x <- factor(df$x, levels = df3$x)    
    
    ggplot(data = df, aes(x, y, fill = fill)) +
      geom_col(position = position_fill()) 
    

    enter image description here

    0 回复  |  直到 5 年前
        1
  •  1
  •   JasonAizkalns    5 年前

    我不确定这是否一定会更好,但这里有一种方法可以在您的问题中生成相同的图形:

    df %>%
      group_by(x) %>%
      mutate(pct = n / sum(n)) %>%
      ungroup() %>%
      arrange(fill != "z", desc(pct)) %>%
      group_by(fill) %>%
      mutate(order = row_number()) %>%
      ggplot(aes(fct_reorder(x, order), pct, fill = fill)) +
      geom_col()
    

    根据您实际要比较的内容,您可能需要考虑不同的顺序或方面。例如,考虑当您选择切面与堆叠时会发生什么:

    df %>% 
      group_by(x) %>%
      mutate(pct = n / sum(n)) %>%
      ggplot(aes(x, pct, fill = fill)) +
      geom_col() +
      facet_wrap(~ fill)
    

    enter image description here

    更新2019-02-18(根据评论) 更新为抽象的认知 z 提前。按序排序 mean(pct) 对于每一个 fill 然后 pct :

    df %>%
      group_by(x) %>%
      mutate(pct = n / sum(n)) %>%
      group_by(fill) %>%
      mutate(mean_pct = mean(pct)) %>%
      arrange(desc(mean_pct), desc(pct)) %>%
      mutate(order = row_number()) %>%
      ggplot(aes(fct_reorder(x, order), pct, fill = fill)) +
      geom_col()