【问题标题】:How to plot numeric vectors over time into a graph如何将随时间变化的数值向量绘制成图表
【发布时间】:2021-02-26 21:12:44
【问题描述】:

我有一个看起来像这样的数据框,其中每一行代表一个人,列代表不同时间点的一些值。我正在尝试将它们绘制成图表(首选 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,然后在绘制出来之前将它们放入更传统的数据框中?谢谢!

【问题讨论】:

  • 嗨,杰夫。您包含的样本数据不允许您描述的图,因为大多数子组的标准偏差为零或未定义。你能分享一个更真实的数据集吗?
  • 啊抱歉我不能公开真实数据,所以我选择了简化版本,但数据集有数千个数据点(散布有 NA),所以它应该有一个适当的 SD。我主要想知道是否可以将一整列作为输入,并将 colnames() 作为 x 轴点?
  • 如果你愿意,我可以编一些数据给你答案?

标签: r ggplot2


【解决方案1】:

让我们用 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 个月,我们需要将我们的数据转换为长格式,以给出一个单独的列,其中每个列都是因子水平。我们可以通过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")

【讨论】:

  • 谢谢,这很好用!据我了解,pivot_longer()gather() 的较新版本,当我想将列名转换为以整洁格式合并到数据框中的变量时最有用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多