ggplot2 Добавление меток данных к диаграмме сгруппированных гистограмм - PullRequest
0 голосов
/ 17 июня 2020

У меня есть таблица под названием «год», которая выглядит так:

#   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 год, 4 звезды отсутствуют, хотя должны быть 13.1 2) Мои ярлыки повсюду, а я бы хотел, чтобы они располагались над соответствующим столбцом на диаграмме .

Может ли кто-нибудь помочь мне с этой проблемой?

Ответы [ 3 ]

2 голосов
/ 17 июня 2020

Вам нужно правильно настроить группировку, чтобы уклонение работало. Вместо использования 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")

enter image description here

1 голос
/ 17 июня 2020

Проблема №1: Вы получаете это сообщение, потому что строка №25 имеет значение pct 50,6, и вы устанавливаете максимальный предел по оси Y равным 50.

Проблема № 2: Использование position_dodge2 в вашем geom_text заставит метки выровняться, и я думаю, что добавление небольшого пространства над полосой сделает ее более читаемой, поэтому я также добавил vjust = -1

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_dodge2(width = .9),
            vjust = -1,
            fontface = "bold",
            size = 4) +
  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")

enter image description here

0 голосов
/ 17 июня 2020

Просто используйте position_dodge2, чтобы исправить метки и избавьтесь от ylim, чтобы отобразить все данные:

library(ggplot2)

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(aes(label=round(pct, digits = 1)),
            position=position_dodge2(0.9),
            size = 4, fontface = "bold") +
  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")

...