堆积条形图ggplot2
Stacked Bar Plot ggplot2
我知道这个问题被问了很多,但我在 R 中制作 100% 堆叠条形图时遇到了问题。我知道有很多页面解释了如何,但没有任何效果,我认为数据我导入的配置不正确,所以基本上我想知道我在这方面做错了什么。我正在使用的数据看起来像附图中的数据。我可以在 Excel 中创建我想要的精确图表,我也附上了它(右边的条形图;我不能附上多张图片,所以它们都在同一个一个),但出于各种原因我需要它在 R 中。数据在 Excel 中的写入方式是否不正确,如果是这样,我该如何正确处理?
至少在 ggplot2
中,您需要将数据从 "wide" 格式转换为 "long" 格式。下面,我使用 tidyr::gather
函数将两个数据列("running" 和 "jumping")"gather" 合并为一个 "fraction" 列,然后您可以根据"activity".
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()
您也可以通过转换为 "wide" 矩阵在基数 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")
我知道这个问题被问了很多,但我在 R 中制作 100% 堆叠条形图时遇到了问题。我知道有很多页面解释了如何,但没有任何效果,我认为数据我导入的配置不正确,所以基本上我想知道我在这方面做错了什么。我正在使用的数据看起来像附图中的数据。我可以在 Excel 中创建我想要的精确图表,我也附上了它(右边的条形图;我不能附上多张图片,所以它们都在同一个一个),但出于各种原因我需要它在 R 中。数据在 Excel 中的写入方式是否不正确,如果是这样,我该如何正确处理?
至少在 ggplot2
中,您需要将数据从 "wide" 格式转换为 "long" 格式。下面,我使用 tidyr::gather
函数将两个数据列("running" 和 "jumping")"gather" 合并为一个 "fraction" 列,然后您可以根据"activity".
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()
您也可以通过转换为 "wide" 矩阵在基数 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")