【发布时间】:2018-12-13 20:38:40
【问题描述】:
我重新开始使用 R 和 ggplot 来可视化环境变量的时间序列数据。到目前为止,我喜欢 ggplot2 可视化数据的机会,轻松选择不同的时期和变量来绘制和定义美学。但现在我遇到了第一个我无法用谷歌搜索的问题:
- 我的目标是将来自不同数据帧的多个变量与个人美学(固定周期、相同 y 轴、不同颜色等)绘制到一个图中
我有 8 个数据帧 ("TreeA" - "TreeH") 结构如下,其中TreeA 是数据帧的名称,“时间”是测量时间,格式为POSIXct格式,Tleaf、Tair 和 Tdiff 是 16 个变量中的三个:
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
我已经 melted 将 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 的所有变量,但当然我需要比较相同的变量,并且我还想为每个变量指定美学(线条的颜色、虚线等。
所以我的问题是:
- 如何在一个 Plot 中比较
TreeA和TreeB? - 我也会 打开以合并不同的数据框,但它不起作用 使用相同的变量名以长格式连接
我希望我的问题足够清楚,并且您能以某种方式帮助我。我相信有一个简单的方法可以解决我的问题,但正如我所说,谷歌搜索到目前为止并没有产生好的结果。
谢谢你,祝你有美好的一天! 康拉德
【问题讨论】:
-
我认为您可能应该附加
treeA-treeH数据集,包括数据名称的指示变量(例如dplyr::bind_rows(tibble::lst(treeA, treeB, <...>, treeH), .id = "data")),然后melt()并使用数据集指示符变量来构建你的情节。如果您需要更具体的建议,请提供reproducible example。 -
谢谢。我无法生成可重现的示例,因为我无法上传我的 *csv 输入。无论如何,在您的大力帮助下,我离解决方案只有一步之遥:使用
dplyr::bind_rows,我得到一个数据框,其中data列表示测量值是否属于treeA, treeB,...。我可以告诉 'melt()' 函数从各自的列Tleaf,Tair...中提取variable列的名称,并将其与来自melt()的data列结合起来,生成一个带有变量列的长数据集条目treeATleaf, treeBTleaf,... -
你不能直接用
melt()做那个;但是如果你愿意,你可以在melt()之后将data和variable列一起paste()来实现。但是,将两者分开可能是一个好主意:这将允许更轻松地控制绘图的美学。我添加了一个答案,展示了我将在此处采用的方法。 -
顺便说一句,如果您需要创建一个包含复杂/大数据的示例,最好使用
dput(head(data))轻松生成读取一小部分数据所需的代码. -
好的,谢谢。我如何告诉 aes 函数从两列中提取信息?
标签: r plot ggplot2 time-series tidyr