r - 从时间序列中的不同数据框中绘制多个具有相同名称的变量;ggplot2 tidyr
问题描述
我重新开始使用 R 和 ggplot 来可视化环境变量的时间序列数据。到目前为止,我喜欢 ggplot2 可视化数据的机会,轻松选择不同的时期和变量来绘制和定义美学。但现在我遇到了第一个我无法用谷歌搜索的问题:
- 我的目标是将来自不同数据帧的几个变量与个人美学(固定周期、相同的 y 轴、不同的颜色等)绘制到一个图中
我有 8 个数据帧(“ TreeA
”-“ TreeH
”),其结构如下所示,其中TreeA
是数据帧的名称,“时间”是测量时间,格式为POSIXct
, 和Tleaf
,是 16 个变量中的三个Tair
:Tdiff
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
我已将melt
DF 编辑为长格式,结果
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
但当然我需要比较相同的变量,并且我想为每个变量指定美学(线条的颜色、虚线等。
所以我的问题是:
- 我如何在一个情节中
TreeA
进行比较?TreeB
- 我也愿意合并不同的数据框,但它无法以具有相同变量名的长格式连接
我希望我的问题足够清楚,你能以某种方式帮助我。我相信我的问题有一个简单的解决方案,但正如我所说,谷歌搜索到目前为止并没有产生好的结果。
谢谢你,有一个美好的一天!康拉德
解决方案
我认为您可能应该附加 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 日创建。
推荐阅读
- python - 我有一个包含 100 个元素的列表,我想使用 import csv 将其制成 excel 中的 10x10 表格
- javascript - 控制台不会记录 div 数组
- java - 无法初始化代理 - 没有会话,在 Spring 拦截器内
- sql - 使用 ComboBox 和 LIKE 语句根据另一列填充 MS-Access 表
- android - 如何打包 PagedList<>?
- angularjs - AngularJS $location.path 在桌面上工作但在移动设备上不工作
- ios - 错误 - 电子邮件地址格式错误。Xcode Swift Firebase
- javascript - 如何用material-ui设置时钟(timePicker)的颜色?
- c# - 在 xamarin 中使用 Exoplayer 的自定义渲染器进行导航
- scala - 从顶部/底部行列值复制丢失的数据