【问题标题】:How to label the count of each bin within ggridges package?如何标记 ggridges 包中每个 bin 的计数?
【发布时间】:2023-03-26 18:39:01
【问题描述】:

我有一个模拟 NFL 赛季的数据框,包含 2 列:球队和排名。我正在尝试使用 ggridges 绘制每个团队在 1-10 的每个级别的频率分布图。我可以让情节正常工作,但我想在每个箱子中显示每个团队/排名的计数。到目前为止,我一直没有成功。

   ggplot(results, 
       aes(x=rank, y=team, group = team)) +
   geom_density_ridges2(aes(fill=team), stat='binline', binwidth=1, scale = 0.9, draw_baseline=T) +
   scale_x_continuous(limits = c(0,11), breaks = seq(1,10,1)) +
   theme_ridges() +
   theme(legend.position = "none") +
   scale_fill_manual(values = c("#4F2E84", "#FB4F14",  "#7C1415", "#A71930", "#00143F", "#0C264C", "#192E6C", "#136677", "#203731"), name = NULL)

创建了这个情节:

我尝试在此行中添加以将计数添加到每个 bin,但它不起作用。

   geom_text(stat='bin', aes(y = team + 0.95*stat(count/max(count)),
                         label = ifelse(stat(count) > 0, stat(count), ""))) +

不是确切的数据集,但这至少足以运行原始图:

   results = data.frame(team = rep(c('Jets', 'Giants', 'Washington', 'Falcons', 'Bengals', 'Jaguars', 'Texans', 'Cowboys', 'Vikings'), 1000), rank = sample(1:20,9000,replace = T))

【问题讨论】:

    标签: r ggridges


    【解决方案1】:

    如何计算每个 bin 的计数,加入原始数据并使用新变量 n 作为标签?

    library(dplyr) # for count, left_join
    
    results %>% 
      count(team, rank) %>% 
      left_join(results) %>% 
      ggplot(aes(rank, team, group = team)) +
      geom_density_ridges2(aes(fill = team), 
                           stat = 'binline', 
                           binwidth = 1, 
                           scale = 0.9, 
                           draw_baseline = TRUE) +
      scale_x_continuous(limits = c(0, 11), 
                         breaks = seq(1, 10, 1)) +
      theme_ridges() +
      theme(legend.position = "none") +
      scale_fill_manual(values = c("#4F2E84", "#FB4F14",  "#7C1415", "#A71930", "#00143F",
                                   "#0C264C", "#192E6C", "#136677", "#203731"), name = NULL) +
      geom_text(aes(label = n), 
                color = "white", 
                nudge_y = 0.2)
    

    结果:

    【讨论】:

      【解决方案2】:

      Neilfws 的回答很棒,但我一直发现 geom_ridgelines 在这种情况下很难使用,所以我通常使用 geom_rect 重新创建它们:

      library(dplyr)
      
      results %>%
        count(team, rank) %>%
        filter(rank<=10) %>%
        mutate(team=factor(team)) %>%
        ggplot() +
        geom_rect(aes(xmin=rank-0.5, xmax=rank+0.5, ymin=team, fill=team,
                      ymax=as.numeric(team)+n*0.75/max(n))) +
        geom_text(aes(x=rank, y=as.numeric(team)-0.1, label=n)) +
        theme_ridges() +
        theme(legend.position = "none") +
        scale_fill_manual(values = c("#4F2E84", "#FB4F14",  "#7C1415", "#A71930", 
                                     "#00143F", "#0C264C", "#192E6C", "#136677", 
                                     "#203731"), name = NULL) +
        ylab("team")
      

      我特别喜欢geom_rect 的精细控制水平,而不是山脊线。但是你确实错过了围绕每条山脊线绘制的漂亮边界线,所以如果这很重要,那么请选择另一个答案。

      【讨论】:

      • @Neilfws 的答案非常好,但是在使用实际分布时,您的标签更容易阅读。也就是说,一些比其他小得多的条不能完全显示覆盖在条内的文本。您将标签放在轴下方的答案使其更加清晰。两个答案都解决了这个问题。非常感谢!
      • @D.Bryant 没错,我的回答只是说明了geom_text 的基础知识,但您可以调整标签的颜色和位置。
      猜你喜欢
      • 2020-11-16
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      • 2021-08-21
      • 2020-06-12
      • 2018-06-22
      • 1970-01-01
      相关资源
      最近更新 更多