为什么在尝试基于聚合数据绘制堆积面积图时 ggplot geom_area 为空?

Why is ggplot geom_area empty when attempting to plot a stacked area graph based off aggregated data?

我正在尝试创建一个堆积面积图来指示每个 month/year 分配主题的推文比例。我的数据框有三列; tweet_time,话题,数。下面粘贴了一个 head() 。 我已经看过类似的问题,例如下面的问题,但在这种情况下,它们各自的解决方案都没有提供解决方案。

我的数据框如下:

 tweet_time Topic count
   <chr>      <chr> <dbl>
 1 01-2012    2         3
 2 01-2012    3         4
 3 01-2012    4         4
 4 01-2012    5         2
 5 01-2013    1        15
 6 01-2013    2        57
 7 01-2013    3        65
 8 01-2013    4        66
 9 01-2013    5        54
10 01-2014    1         3
11 01-2014    2         7
12 01-2014    3        10
13 01-2014    4         5
14 01-2014    5         2
15 01-2015    1         3
16 01-2015    2         6
17 01-2015    3         6
18 01-2015    4         5
19 01-2015    5         8
20 01-2016    1         7

我目前用于绘图的代码是:

ggplot(test, aes(x = tweet_time,y = count, fill = Topic))+
 geom_area(aes(fill= Topic, position='stack'))

我想知道问题是否与 tweet_time 列未按月排序(即 02/2012 不是紧接在 01/2012 之后)以及格式不是日期有关?但是,当尝试改变 as.date 时,它无法识别格式。

任何帮助都会很棒。

我认为这里有三个问题可能会导致您的问题或导致一个问题:

  1. 日期不是日期格式

我添加 mutate(tweet_time = lubridate::dmy(paste(1, tweet_time))) %>% 以转换为日期,这将更自动地与 ggplot2

一起工作
  1. 缺少组合

当零被排除在系列之外时,面积图可能会错误地显示,因为 ggplot 是否加入存在的数据点(它做什么)与假设缺失点代表零(通常是我们想)。您可以添加 tidyr::complete(tweet_time, Topic, fill = list(count = 0)) %>% 来添加这些。

  1. 填写为整数

对于面积图,如果填充是整数而不是字符或因子,ggplot 可能会抛出 Error: Aesthetics can not vary with a ribbon。我不完全确定为什么会发生这种情况以及是否有理由以这种方式工作,但最简单的解决方法是让它填充一个字符或因子。

下面的代码对我有用:

library(tidyverse)
data.frame(
  stringsAsFactors = FALSE,
        tweet_time = c("01-2012","01-2012","01-2012",
                       "01-2012","01-2013","01-2013","01-2013","01-2013",
                       "01-2013","01-2014","01-2014","01-2014","01-2014",
                       "01-2014","01-2015","01-2015","01-2015","01-2015",
                       "01-2015","01-2016"),
             Topic = c(2L,3L,4L,5L,1L,2L,3L,4L,
                       5L,1L,2L,3L,4L,5L,1L,2L,3L,4L,5L,1L),
             count = c(3L,4L,4L,2L,15L,57L,65L,
                       66L,54L,3L,7L,10L,5L,2L,3L,6L,6L,5L,8L,7L)
) %>%
  tidyr::complete(tweet_time, Topic, fill = list(count = 0)) %>%
  mutate(tweet_time = lubridate::dmy(paste(1, tweet_time))) %>%
  ggplot(aes(tweet_time, count, fill = as.character(Topic))) +
  geom_area(position = 'stack')