【问题标题】:Rolling average trendline on stacked barchart in rr中堆叠条形图的滚动平均趋势线
【发布时间】:2020-12-22 03:50:40
【问题描述】:

我正在尝试复制 nytimes covid 案例条形图,但我想将其设为堆叠条形图。我的问题是 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)

【问题讨论】:

  • 我不明白你想要的输出是什么。或许您可以用更小的样本数据集更清楚地说明问题?
  • 好的,我希望这些数字有助于描述我想要什么

标签: r ggplot2 moving-average


【解决方案1】:

问题是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,
  )

【讨论】:

  • 不客气。顺便说一句:不需要第二个数据集的另一个选择是使用stat_summary(aes(y = seven_avg), fun = "sum", geom = "line", color = "red", size = .75),它将为您进行聚合。但是请注意,趋势线会有所不同,因为在这种情况下,状态趋势将被简单地汇总。
【解决方案2】:

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

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

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

第一个是每个月的第一天而不是数据集中每天的所有状态的条形图。由于 56 表示即使有图例也很难阅读,所以我从这些图中删除了图例。 哇 11 月 1 日德克萨斯州的 71k 病例增加了怎么办? (我手动检查数据,看看哪个州拥有那个高杆)

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")

这是seven_avg 56 个状态的折线图

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

【讨论】:

    猜你喜欢
    • 2021-12-11
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 2022-07-05
    相关资源
    最近更新 更多