堆叠条形图ggplot2

时间:2018-08-07 17:46:34

标签: r ggplot2 geom-bar

我知道这个问题经常被问到,但是我在制作R中100%堆积的条形图时遇到了麻烦。我知道那里有很多页面解释了如何做,但是什么也没用,我认为我的数据m导入的配置不正确,因此基本上我想知道我在这方面做错了什么。我使用的数据看起来像所附图片中的数据。我可以在Excel中创建我想要的确切图表(我也已附加了该图表(右侧的条形图;我不能附加一张以上的图片,因此它们都在同一张图片中)),但是由于各种原因,我需要将其放在R中。用Excel编写数据的方式是否正确?如果是,我该如何正确设置?

data being used on left, correct excel graph on right

1 个答案:

答案 0 :(得分:1)

至少在ggplot2中,您需要将数据从“宽”格式转换为“长”格式。下面,我使用tidyr::gather函数将两个数据列(“运行”和“跳跃”)“聚集”到单个“分数”列中,然后可以通过“活动”对其进行着色。

library(magrittr)                       # For pipe (%>%)

dat <- tibble::tibble(
  weeks = 1:15,
  running = runif(15, 0, 1),
  jumping = 1 - running
)

dat
#> # A tibble: 15 x 3
#>    weeks running jumping
#>    <int>   <dbl>   <dbl>
#>  1     1  0.675   0.325 
#>  2     2  0.727   0.273 
#>  3     3  0.430   0.570 
#>  4     4  0.324   0.676 
#>  5     5  0.809   0.191 
#>  6     6  0.260   0.740 
#>  7     7  0.433   0.567 
#>  8     8  0.872   0.128 
#>  9     9  0.0288  0.971 
#> 10    10  0.903   0.0970
#> 11    11  0.295   0.705 
#> 12    12  0.538   0.462 
#> 13    13  0.342   0.658 
#> 14    14  0.291   0.709 
#> 15    15  0.877   0.123

library(ggplot2)

dat_long <- dat %>%
  tidyr::gather(activity, fraction, running, jumping)

dat_long
#> # A tibble: 30 x 3
#>    weeks activity fraction
#>    <int> <chr>       <dbl>
#>  1     1 running    0.675 
#>  2     2 running    0.727 
#>  3     3 running    0.430 
#>  4     4 running    0.324 
#>  5     5 running    0.809 
#>  6     6 running    0.260 
#>  7     7 running    0.433 
#>  8     8 running    0.872 
#>  9     9 running    0.0288
#> 10    10 running    0.903 
#> # ... with 20 more rows

ggplot(dat_long) +
  aes(x = factor(weeks), y = fraction, fill = activity) +
  geom_col()

您也可以在基数R中通过转换为“宽”矩阵来执行此操作。 (请注意,我也使用[, -1]删除第一列)。

dat_tmat <- t(as.matrix(dat[, -1]))
dat_tmat
#>              [,1]      [,2]      [,3]      [,4]       [,5]      [,6]
#> running 0.5227949 0.5352537 0.5879579 0.2678927 0.93068128 0.2948861
#> jumping 0.4772051 0.4647463 0.4120421 0.7321073 0.06931872 0.7051139
#>               [,7]      [,8]      [,9]       [,10]      [,11]     [,12]
#> running 0.07729363 0.8925416 0.5503279 0.007479232 0.02991765 0.5832765
#> jumping 0.92270637 0.1074584 0.4496721 0.992520768 0.97008235 0.4167235
#>             [,13]     [,14]     [,15]
#> running 0.8660134 0.1156794 0.3176998
#> jumping 0.1339866 0.8843206 0.6823002

barplot(dat_tmat, col = c("blue", "red"))
legend("topleft", c("running", "jumping"), col = c("blue", "red"), lwd = 5, bg = "white")