在 ggplot R 中的堆叠条形图 returns 错误消息顶部添加文本(样本大小)

Adding text (sample size) on top of stacked bar chart returns error message in ggplot R

当前数字: 期望的效果:

我有一个堆叠条形图,我想在图表顶部添加样本大小,我尝试使用带有以下代码的 geomtext:

Data %>% count(Month, Age) %>%
  group_by(Month) %>%
  mutate(percent = n/sum(n)*100) %>%
  ggplot(aes(Month, percent, fill = as.factor(Age))) +
  geom_col(position = "fill") + ylab("") +
  geom_text(aes(label = n_month, y = 1.05)) +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(values = c("#009E73", "#E69F00", "#0072B2")) +
  theme(axis.text = element_text(size = 17), 
        legend.text = element_text(size = 18),
        axis.title.x = element_text(margin = margin(t = 10), size = 16))

这个returns错误,我的理解是因为这个图中其实有34个数据,而我只想让它显示12个数字。现在我只有在只有 12 个数据的情况下才能成功(因此是“预期效果”图)。我应该如何更改我的代码?

Error: Aesthetics must be either length 1 or the same as the data (34): label" 
n_month
 [1] 18  8 20 18 24 34 32 15 22 26 12 13

抱歉耽搁了。我试图重现您的数据,问题是基础数据。对于您的方法,为您的 geom 设置不同的数据集会更容易。

对于这个例子,我使用的是 nycflights13 数据,它可能与您的数据相似。

这是我的设置:

library(dplyr)
library(ggplot2)
library(nycflights13)

graph_data <- flights %>% 
  filter(carrier %in% c("UA", "B6", "EV")) %>% 
  count(carrier, month) %>% 
  add_count(month, wt = n, name = "n_month") %>% 
  mutate(percent = n / n_month * 100) 

数据看起来像:

# A tibble: 36 × 3
   carrier month     n n_month percent
   <chr>   <int> <int>   <int>   <dbl>
 1 B6          1  4427   13235    33.4
 2 B6          2  4103   12276    33.4
 3 B6          3  4772   14469    33.0

现在我们根据您的 graph_data.

geom_col()geom_text() 提供不同的数据集

ggplot() +
  geom_col(
    data = graph_data,
    aes(x = month, y = percent, fill = as.factor(carrier)), 
    position = "fill") + ylab("") +
  geom_text(
    data = distinct(graph_data, month, n_month),
    aes(x = month, y = 1.05, label = n_month)) +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(values = c("#009E73", "#E69F00", "#0072B2")) +
  theme(axis.text = element_text(size = 17), 
        legend.text = element_text(size = 18),
        axis.title.x = element_text(margin = margin(t = 10), size = 16))

我尽量保留你的代码,只是在 geom_ 中添加了 data = ... 参数。

输出为: