繁体   English   中英

如何将 plot 随时间变化的数值向量转换成图形

[英]How to plot numeric vectors over time into a graph

我有一个 dataframe 看起来像这样,其中每一行代表一个人,列代表不同时间点的一些值。 我正在尝试将 plot 它们放入图表中(首选 ggplot),其中 x 轴将是 3 个月、6 个月、9 个月,而 y 轴将显示平均值 +/- SD(删除 NA)整列然后按df$type分层。

   3months 6months 9months  type
1       1      NA       4 young
2       2       3       4 young
3       3       3      NA   old
4      NA       3       4   old
5       5       3       4   old

有什么方法可以实现这一点,还是我必须手动计算所有均值和 SD,然后在绘制之前将它们放入更传统的 dataframe 中? 谢谢!

让我们来看一个更实际大小的 100 行样本:

set.seed(69)
nrows <- 100
df <- data.frame(`3months` = c(sample(c(1:5, NA), nrows/2, TRUE),
                               sample(c(3:7, NA), nrows/2, TRUE)),
                  `6months` = c(sample(c(2:6, NA), nrows/2, TRUE),
                                sample(c(4:8, NA), nrows/2, TRUE)),
                  `9months` = c(sample(c(3:7, NA), nrows/2, TRUE),
                                sample(c(5:9, NA), nrows/2, TRUE)),
                  type = rep(c("young", "old"), each = nrows/2))
names(df) <- c("3months", "6months", "9months", "type")

前六行如下所示:

head(df)
#>   3months 6months 9months  type
#> 1       1       2       6 young
#> 2       3      NA       5 young
#> 3       2       6      NA young
#> 4       5      NA       7 young
#> 5      NA       6      NA young
#> 6       5       4       6 young

如果我们想在 x 轴上有 3 个月、6 个月、9 个月,我们需要将 pivot 数据转换为长格式以给出一个列,其中每个列都是因子水平。 我们可以使用tidyr::pivot_longer来实现:

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

pivot_longer(df, 1:3) %>%
  group_by(type, name) %>%
  summarise(mean = mean(value, na.rm = TRUE),
            upper = mean + sd(value, na.rm = TRUE),
            lower = mean - sd(value, na.rm = TRUE)) %>%
  ggplot(aes(name, mean, group = type, color = type)) +
  geom_line(position = position_dodge(width = 0.1)) +
  geom_point(col = "black",
                position = position_dodge(width = 0.1)) +
  geom_errorbar(aes(ymin = lower, ymax = upper), 
                width = 0.2, alpha = 0.5,
                position = position_dodge(width = 0.1)) +
  labs(x = "Time", y = "Mean +/- SD")

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM