首页 > 解决方案 > 从时间序列中的不同数据框中绘制多个具有相同名称的变量;ggplot2 tidyr

问题描述

我重新开始使用 R 和 ggplot 来可视化环境变量的时间序列数据。到目前为止,我喜欢 ggplot2 可视化数据的机会,轻松选择不同的时期和变量来绘制和定义美学。但现在我遇到了第一个我无法用谷歌搜索的问题:

我有 8 个数据帧(“ TreeA”-“ TreeH”),其结构如下所示,其中TreeA是数据帧的名称,“时间”是测量时间,格式为POSIXct, 和Tleaf,是 16 个变量中的三个TairTdiff

 TreeA
                         Zeit  Tleaf     Tair  Tdiff ........
       1: 2018-05-18 00:00:00 12.997 13.20000 -0.203   
       2: 2018-05-18 00:10:00 13.082 13.20000 -0.119     
       3: 2018-05-18 00:20:00 11.909 12.06700 -0.158   
       4: 2018-05-18 00:30:00 11.315 11.53300 -0.219     
       5: 2018-05-18 00:40:00 11.251 11.46700 -0.216

我已将meltDF 编辑为长格式,结果

TreeA_long
                      Time variable        value
    1: 2018-05-18 00:00:00    Tleaf        12.997000000
    2: 2018-05-18 00:10:00    Tleaf        13.082000000
    3: 2018-05-18 00:20:00    Tair         11.909
    4: 2018-05-18 00:30:00    Tair         11.315
    5: 2018-05-18 00:40:00    Tdiff         1.251

从这里我已经成功地用这个 ggplot 功能绘制图表:

ggplot(subset(TreeA_long, variable %in% c("Tleaf","Tair","Tdiff")),
       aes(x=Time,
           y=value, color=variable)) +
  geom_line() +
  scale_x_datetime(limits=start.endKW21, labels = date_format("%d") , breaks = date_breaks("24 hours")) +
  scale_y_continuous(limits = c(5,55),breaks = seq(10,55, by = 2)) +
  labs(title="Mai/Juni Cbet1", x="Day", y="Temperature") +
  theme(legend.position='right') +
  scale_color_manual(values = c("Tleaf" = "green", "Tair" = "blue", "Tdiff" = "yellow"))

我试图添加第二个geom_line(data=TreeB_long)用于在同一个图中从第二个 Dataframe 中绘制变量。它可以绘制所有变量,TreeB但当然我需要比较相同的变量,并且我想为每个变量指定美学(线条的颜色、虚线等。

所以我的问题是:

我希望我的问题足够清楚,你能以某种方式帮助我。我相信我的问题有一个简单的解决方案,但正如我所说,谷歌搜索到目前为止并没有产生好的结果。

谢谢你,有一个美好的一天!康拉德

标签: rplotggplot2time-seriestidyr

解决方案


我认为您可能应该附加 treeA-treeH 数据集,包括数据名称的指示变量(例如dplyr::bind_rows(tibble::lst(treeA, treeB, <...>, treeH), .id = "data")),然后melt()使用数据集指示变量来构建您的绘图。

这是一个简化的例子。首先,让我们读入您提供的数据:

txt <- "Date Time  Tleaf     Tair  Tdiff
2018-05-18 00:00:00 12.997 13.20000 -0.203
2018-05-18 00:10:00 13.082 13.20000 -0.119
2018-05-18 00:20:00 11.909 12.06700 -0.158
2018-05-18 00:30:00 11.315 11.53300 -0.219
2018-05-18 00:40:00 11.251 11.46700 -0.216"

treeA <- read.table(text = txt, header = TRUE,
                    stringsAsFactors = FALSE)

为了这个例子,我还 treeB通过添加一些噪音来创建一个数据集treeA

library(dplyr)
library(ggplot2)

set.seed(1)
n <- nrow(treeA)

treeB <- treeA %>%
  mutate_if(is.numeric, function(x) x + rnorm(n))

我们现在可以附加两个数据集bind_rows()并添加一个变量来显示原始数据框。

tree <- tibble::lst(treeA, treeB) %>%
  bind_rows(.id = "data") %>%
  mutate(dttm = as.POSIXct(paste(Date, Time)))

在绘图之前,将数据重新整形为长格式很有用,就像您之前所做的那样:

tree_long <- reshape2::melt(tree, measure = c("Tleaf", "Tair", "Tdiff"))

现在我们准备好绘图了。您要使用的布局的选择当然取决于您要强调的数据的哪个方面;例如,如果对不同数据集之间的比较感兴趣,使用 facetting 比较每个变量tree中的 s 可能是个好主意:tree

ggplot(tree_long, aes(dttm, value, color = data)) +
  facet_wrap(~ variable, scales = "free_y", ncol = 1) +
  geom_line()

reprex 包(v0.2.0.9000) 于 2018 年 7 月 9 日创建。


推荐阅读