r中堆积条形图的滚动平均趋势线

Rolling average trendline on stacked barchart in r

我正在尝试复制 nytimes covid case barplot,但我想让它成为一个堆叠的 barplot。我的问题是 7 天滚动平均趋势线被我的堆叠变量“状态”搞乱了。当然,这种可视化并不理想,但现在我无法弄清楚它让我发疯。如果您不按州分组并删除“color=states”,它会正常工作,如底部图片所示。

library(dplyr)
library(readr)
library(ggplot2)
library(zoo)

data_url <- "http://covidtracking.com/api/states/daily.csv"
corona <- read_csv(data_url)
corona <- corona %>% 
  mutate(date=lubridate::parse_date_time(date, "ymd"))

total<-corona %>%
  group_by(date,state)%>%
summarise_at(vars(positiveIncrease),sum)%>%mutate(seven_avg= rollmean(positiveIncrease, 7,
                             align="left", 
                             fill=0))
  ggplot(total,aes(x=date,
             y=positiveIncrease,fill=state)) +
  geom_col()+
  geom_line(aes(y = seven_avg), 
            color = "red", 
            size = .75)

问题是 geom_line 不会为您聚合数据。相反,您会得到一条趋势线,该趋势线连接州一级的所有观察结果,而不是总体趋势线。

简单的解决方案是使用聚合数据集来获取聚合趋势线:

library(dplyr)
library(readr)
library(ggplot2)
library(zoo)

data_url <- "http://covidtracking.com/api/states/daily.csv"
corona <- read_csv(data_url)
corona <- corona %>%
  mutate(date = lubridate::parse_date_time(date, "ymd"))

total <- corona %>%
  group_by(date, state) %>%
  summarise_at(vars(positiveIncrease), sum) %>%
  mutate(seven_avg = rollmean(positiveIncrease, 7,
    align = "left",
    fill = 0
  ))

overall <- total %>%
  group_by(date) %>%
  summarise_at(vars(positiveIncrease), sum) %>%
  mutate(seven_avg = rollmean(positiveIncrease, 7,
                              align = "left",
                              fill = 0
  ))

ggplot(total, aes(
  x = date,
  y = positiveIncrease
)) +
  geom_col(aes(color = state)) +
  geom_line(data = overall, aes(y = seven_avg),
    color = "red",
    size = .75,
  )

不确定您想要什么,但您当前的代码存在多个问题,如果不将图表分解为两个图表很难看清。

  1. 你的日期有 56 个州(美国有 56 个州吗?-我以为是 50 个)当你绘制 geom_line 时,它们都在底部,因为值和比例相对于栏图表,所以它看起来像底部的一个红色斑点,但实际上它是图表底部 56 条红线的组合。
  2. 不确定你想在这里合并什么,但是 9 个月的每日图表将是大量数据,可以在一张图表上绘制所有 56 个州。您能否想出您想要回答的具体问题,然后我们就可以想出如何绘制数据图表的更好想法。

这是我的代码,将您的原始代码分解为两个图表,以便更容易理解数据包含的内容以及 ggplot 的工作原理。

第一个是每个月 1 号所有州的条形图,而不是数据集中的每一天。正如 56 所说,即使有图例也很难阅读,所以我从这些图中删除了图例。 WOW 德克萨斯州在 11 月 1 日增加了 71,000 例病例,这是怎么回事? (我手动检查数据以查看哪个州拥有那个高杆)

ggplot(data = total %>% filter(lubridate::day(date) == 1)) +
  geom_col(aes(x = date,
               y = positiveIncrease, group = state,
               color = state), position = "dodge") +
  theme(legend.position = "none")

这是56个州seven_avg的折线图

ggplot(data = total) +
  geom_line(aes(x = date, y = seven_avg, group = state,
                color = state), 
            size = .75) +
  theme(legend.position = "none")