1

我有一个模拟 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))
4

2 回答 2

5

如何计算每个 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)

结果:

在此处输入图像描述

于 2020-10-27T02:22:58.013 回答
1

Neilfws 的回答很好,但我总是发现geom_ridgeline在这种情况下很难使用 s,所以我通常使用以下方法重新创建它们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而不是山脊线。但是你确实失去了围绕每条山脊线绘制的漂亮边界线,所以如果这很重要,那么请选择另一个答案。

于 2020-10-27T02:30:00.947 回答