带有 R 的 ggplot 中计数的累积堆积面积图

Cumulative stacked area plot for counts in ggplot with R

我有过去几十年采用的政策时间序列,我想用累积政策 counts, 制作堆积面积图,因为它们在之后仍然有效采用。我希望它们按组织分组,x 为时间,y 为累积计数,以显示政策采用随时间的增长。

数据:

df<- data.frame(
  organization = c("a", "a", "c", "c", "a", "b"),
  year = c(1990, 1991, 1992, 1993, 1994, 1995),
  count= c(1,1,1,0,1,1))

我试过以下方法:

df%>%
group_by(organization, year) %>%
summarise(total = sum(count)) %>%
ggplot(  aes(x=year, y= cumsum( total),fill=factor(organization))) +
geom_area(position = "stack")

现在我得到这样一个不累积的情节 -- 我认为这是因为多年来没有采取任何政策。

我有兴趣得到这样的东西:

图片来源:https://www.r-graph-gallery.com/136-stacked-area-chart.html

非常感谢任何帮助!!!

每个组织每年都需要代表,即使该组织有 0 个。然后将 mutate 添加到您的代码中并绘制累计总数。

为每个组织重新制作数据示例,使其每年都有一个数字,有些是 0

df = data.frame(time = rep(c(1990,1991,1992),3),
org = c("a","a","a","b","b","b","c","c","c"),
num = c(1,0,1,0,0,1,1,1,1))


  df%>%
  group_by(org, time) %>%
  summarise(total = sum(num)) %>%
  mutate(newtot = cumsum(total))%>%
  ggplot(aes(x= time, y= newtot,fill=org)) +
  geom_area()

对于每个组织,您需要确保至少有一个最小和最大年份的计数值。这样 ggplot2 将填补空白。此外,您需要小心计算总和。因此,如果最早和去年的值不存在,我在下面显示的解决方案会添加一个零计数。

我添加了一些代码,以便您可以自动为没有第一和最后 年数据的组织添加行。 要合并此自动代码,您需要合并 tail_dat complete_dat 数据框并更改 [=16] 中的变量 dat =] 定义以适合您自己的数据。

library(ggplot2)
library(dplyr)
library(tidyr)

# Create sample data
dat <- tribble(
  ~organization, ~year, ~count,
  "a", 1990, 1,
  "a", 1991, 1,
  "b", 1991, 1,
  "c", 1992, 1,
  "c", 1993, 0,
  "a", 1994, 1,
  "b", 1995, 1
)
dat
#> # A tibble: 7 x 3
#>   organization  year count
#>   <chr>        <dbl> <dbl>
#> 1 a             1990     1
#> 2 a             1991     1
#> 3 b             1991     1
#> 4 c             1992     1
#> 5 c             1993     0
#> 6 a             1994     1
#> 7 b             1995     1

# NOTE incorrect results for comparison
dat %>%
  group_by(organization, year) %>%
  summarise(total = sum(count)) %>%
  ggplot(aes(x = year, y = cumsum(total), fill = organization)) +
  geom_area()
#> `summarise()` regrouping output by 'organization' (override with `.groups` argument)


# Fill out all years and organization combinations
complete_dat <- tidyr::expand(dat, organization, year = 1990:1995)
complete_dat
#> # A tibble: 18 x 2
#>    organization  year
#>    <chr>        <int>
#>  1 a             1990
#>  2 a             1991
#>  3 a             1992
#>  4 a             1993
#>  5 a             1994
#>  6 a             1995
#>  7 b             1990
#>  8 b             1991
#>  9 b             1992
#> 10 b             1993
#> 11 b             1994
#> 12 b             1995
#> 13 c             1990
#> 14 c             1991
#> 15 c             1992
#> 16 c             1993
#> 17 c             1994
#> 18 c             1995

# Update data so that counting works and fills in gaps
final_dat <- complete_dat %>%
  left_join(dat, by = c("organization", "year")) %>%
  replace_na(list(count = 0)) %>%  # Replace NA with zeros
  group_by(organization, year) %>%
  arrange(organization, year) %>%  # Arrange by year so adding works
  group_by(organization) %>%
  mutate(aggcount = cumsum(count))
final_dat
#> # A tibble: 18 x 4
#> # Groups:   organization [3]
#>    organization  year count aggcount
#>    <chr>        <dbl> <dbl>    <dbl>
#>  1 a             1990     1        1
#>  2 a             1991     1        2
#>  3 a             1992     0        2
#>  4 a             1993     0        2
#>  5 a             1994     1        3
#>  6 a             1995     0        3
#>  7 b             1990     0        0
#>  8 b             1991     1        1
#>  9 b             1992     0        1
#> 10 b             1993     0        1
#> 11 b             1994     0        1
#> 12 b             1995     1        2
#> 13 c             1990     0        0
#> 14 c             1991     0        0
#> 15 c             1992     1        1
#> 16 c             1993     0        1
#> 17 c             1994     0        1
#> 18 c             1995     0        1

# Plot results
final_dat %>%
  ggplot(aes(x = year, y = aggcount, fill = organization)) +
  geom_area()

reprex package (v0.3.0)

于 2020 年 12 月 10 日创建