首页 > 解决方案 > ggplot2 将数据标签添加到分组直方图

问题描述

我有一个名为“year”的表,如下所示:

#   Year    Stars   n   pct

1   2015    1   778 26.5
2   2015    2   247 8.4
3   2015    3   286 9.7
4   2015    4   439 15
5   2015    5   1186    40.4
6   2016    1   678 22.7
7   2016    2   233 7.8
8   2016    3   256 8.6
9   2016    4   451 15.1
10  2016    5   1372    45.9
11  2017    1   501 24.3
12  2017    2   180 8.7
13  2017    3   215 10.4
14  2017    4   274 13.3
15  2017    5   894 43.3
16  2018    1   391 25.1
17  2018    2   125 8
18  2018    3   144 9.3
19  2018    4   196 12.6
20  2018    5   699 45
21  2019    1   474 22.4
22  2019    2   124 5.9
23  2019    3   168 8
24  2019    4   277 13.1
25  2019    5   1070    50.6
26  2020    1   148 25.3
27  2020    2   50  8.5
28  2020    3   64  10.9
29  2020    4   77  13.1
30  2020    5   247 42.2

数据表示多年来有用户对来自 google play 商店的应用进行评分。他们通过给 1(差)到 5(好)星来评价它。我正在尝试制作一个图表,使用以下代码按星级和年份显示星级份额:

ggplot(year, aes(as.factor(Stars), pct)) + 
  geom_bar(aes(fill = as.factor(Year)), position = "dodge", stat="identity") + 
  scale_fill_manual(values=c("#05668D", "#028090", "#00A896", "#02C39A", "#4ecdc4", "#F0F3BD")) +
  ylab("Share of stars (in %)") +
  xlab("Stars") +
  geom_text(label=round(year$pct, digits = 1),
            position=position_dodge(0.9),
            size = 4, fontface = "bold") +
  ylim(0,50) +
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.background = element_blank(), axis.line = element_line(colour = "black"),
        plot.title = element_text(hjust = 0.5)) +
  ggtitle("Share of stars")

不幸的是,我遇到了两个问题:1)由于某种原因,我收到以下警告消息:警告消息:

1: Removed 1 rows containing missing values (geom_bar). 
2: Removed 1 rows containing missing values (geom_text). 

这意味着 2020 年的数据,虽然应该 13.1 缺少 4 颗星 2)我的标签到处都是,而我希望它们位于图表上相应列的上方。

有人可以帮我解决这个问题吗?

标签: rggplot2labelhistogram

解决方案


您需要正确设置分组才能使闪避起作用。我们可以关闭轴扩展,而不是使用ylim切断您的一个条形图,这对于下降到 0 的条形图看起来更好。(您可能需要使用ylim更高的值以确保打印所有标签。)

ggplot(year, aes(as.factor(Stars), pct)) + 
  geom_col(aes(fill = as.factor(Year)), position = "dodge") + 
  geom_text(
    aes(label = round(pct, digits = 1), group = interaction(Stars, Year)),
    position = position_dodge(0.9), size = 3, fontface = "bold", vjust = 0
  ) +
  scale_fill_manual(values=c("#05668D", "#028090", "#00A896", "#02C39A", "#4ecdc4", "#F0F3BD")) +
  scale_y_continuous(expand = c(0, 0)) +
  theme(
    panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
    panel.background = element_blank(), axis.line = element_line(colour = "black"),
    plot.title = element_text(hjust = 0.5)
  ) +
  labs(title = "Share of stars", x = "Share of stars (in %)", y = "Stars", fill = "Year")

在此处输入图像描述


推荐阅读