[英]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.