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