【问题标题】:Stacked Bar Plot ggplot2堆积条形图 ggplot2
【发布时间】:2019-01-14 21:19:50
【问题描述】:

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

【问题讨论】:

  • 您能否添加一些您尝试过的代码以及哪里出了问题?现在它对我来说似乎是重复的,可能是 this question。但是,一旦您添加了一些代码,我们可能会看到细微的差异。阅读here,了解如何使您的问题可重现。

标签: r ggplot2 geom-bar


【解决方案1】:

至少在ggplot2 中,您需要将数据从“宽”格式转换为“长”格式。下面,我使用tidyr::gather 函数将两个数据列(“running”和“jumping”)“收集”成一个“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()

您也可以在基础 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")

【讨论】:

  • 谢谢!!有没有办法通过导入数据而不是全部输入来做到这一点? (由于某种原因,我无法标记你@Alexey)
  • 当然。 R 可以导入多种数据类型。我会通读 Garret Grolemund 和 Hadley Wickham (r4ds.had.co.nz/data-import.html) 的“R for Data Science”的“数据导入”一章。有用于直接从 Excel 读取的 R 包,但导出到 CSV 可能更容易。此外,如果此答案对您有用,请接受(点击灰色复选标记)并投票(点击向上箭头)。
  • 我的意思是,如何将导入的数据从宽转换为长,然后做同样的事情?我
  • 正如我在回答中所说,tidyr::gather 会将数据从宽转换为长。我上面的代码已经做到了这一点,您可以在文档中找到更多信息和示例(R 提示符下的?tidyr::gather)。要从长转换为宽,请使用tidyr::spread