Deeptime是一个通用的Python库,专门用于从时间序列数据中估计动态模型。它提供了多种工具,用于分析和建模时间序列数据,这对于理解复杂系统的行为至关重要。由于deeptime也在R上有个包,因此我们以最熟悉的R语言进行详解。
有兴趣的朋友可阅读其发表的文献:
Deeptime: a Python library for machine learning dynamical models from time series data - IOPscience
目录
1.包的导入与加载
# 安装deeptime包,可以从CRAN获取稳定版本
install.packages("deeptime")
# 或者从GitHub获取开发版本
# 首先安装devtools包
# install.packages("devtools")
# 然后使用devtools安装deeptime的开发版本
devtools::install_github("willgearty/deeptime")
# 加载deeptime包,用于时间序列分析
library(deeptime)
# 加载ggplot2包,用于数据可视化
library(ggplot2)
# 加载dplyr包,用于数据操作
library(dplyr)
2.coord_geo()函数绘制时间尺度折线图
coord_geo()是deeptime包中的主要函数,其功能类似于ggplot2的coord_trans()函数。使用这个函数,你可以在各种ggplot图中添加高度可定制的时间尺度。
我们以divDyn中一个珊瑚的例子进行演示:
# 加载 divDyn 包,该包包含用于演示的数据集
install.packages("divDyn")
library(divDyn)
# 载入 coral 数据集
data(corals)
# 创建一个示例数据框 coral_div,表示不同阶段的珊瑚属数量及其平均年龄
coral_div <- corals %>%
filter(stage != "") %>% # 过滤掉 stage 为空的行
group_by(stage) %>% # 按 stage 分组
summarise(n = n()) %>% # 计算每个 stage 的珊瑚属数量
mutate(stage_age = (stages$max_age[match(stage, stages$name)] +
stages$min_age[match(stage, stages$name)])/2) # 计算每个 stage 的平均年龄
# 使用 ggplot 创建折线图,横轴为 stage_age(年龄),纵轴为 n(珊瑚属的数量)
ggplot(coral_div) +
geom_line(aes(x = stage_age, y = n)) + # 绘制折线
scale_x_reverse("Age (Ma)") + # 设置横轴标签,并将横轴方向反转,使时间从过去到现在递增
ylab("Coral Genera") + # 设置纵轴标签
coord_geo(xlim = c(250, 0), ylim = c(0, 1700)) + # 设置图表的横轴和纵轴的限制
theme_classic(base_size = 16) # 设置图表主题为经典风格,并指定基础字体大小为16
我们再通过自己模拟的数据进行简单示例:
# 假设我们有一个地震数据集,包含地震发生的年代和震级
earthquake_data <- data.frame(
Age = c(230, 220, 210, 200, 190, 180, 170, 160, 150, 140),
Magnitude = c(7.5, 6.8, 7.2, 6.5, 7.0, 6.3, 6.9, 7.1, 6.7, 6.4)
)
# 使用ggplot2绘制地震震级随时间变化的折线图
p <- ggplot(earthquake_data, aes(x = Age, y = Magnitude)) +
geom_line() +
geom_point() +
scale_x_reverse(breaks = seq(230, 140, by = -10)) +
labs(title = "Earthquake Magnitude Over Time",
x = "Age (Million Years Ago)",
y = "Magnitude")+
theme_classic(base_size = 16)
# 添加地质时间尺度
p + coord_geo(xlim = c(230, 140))
色块中的字母表示地质时期:
在地质学中,Tr、J、K、Pg等缩写代表不同的地质时代或时期。这些缩写通常用于地质时间尺度上,以表示地球历史的不同阶段。下面是这些缩写的含义:
- Tr: Triassic(三叠纪)
- J: Jurassic(侏罗纪)
- K: Cretaceous(白垩纪)
- Pg: Paleogene(古近纪)
- N: Neogene(新近纪)
- Q: Quaternary(第四纪)
这些地质时代按照时间顺序排列,从最早的三叠纪开始,一直到最近的第四纪。每个时代又可以进一步细分为不同的时期或世。例如,三叠纪可以分为早三叠世、中三叠世和晚三叠世。
在地质时间尺度图上,这些时代通常以不同的颜色块表示,每个颜色块代表一个特定的时代或时期。这种表示方法有助于科学家和学生理解地球历史上的重大事件,如生物灭绝、物种演化、大陆漂移等。
3.绘制地质时间尺度上的两个不同的时间尺度
我们利用gsloid包中的数据,绘制一个展示地质时间尺度上氧同位素比例变化的图形,同时叠加了地磁极性年代和浮游有孔虫主要生物带的地理信息。
# 加载所需的包
library(gsloid)
# 使用ggplot2包创建图形,数据集为lisiecki2005
ggplot(lisiecki2005) +
# 添加线图,x轴为d18O(氧同位素比例),y轴为Time除以1000(时间以百万年为单位)
# 设置y轴为主要定向轴
geom_line(aes(x = d18O, y = Time / 1000), orientation = "y") +
# 设置y轴标签为"Time (Ma)",即时间(以百万年为单位),并反转y轴方向
scale_y_reverse("Time (Ma)") +
# 设置x轴标签为"δ18O"(氧同位素比例),并反转x轴方向
scale_x_reverse("\u03B418O") +
# 添加地理坐标系统,包括两个数据层:地磁极性年代和浮游有孔虫主要生物带
# 设置坐标轴限制、位置、旋转角度、跳过的标签以及大小
coord_geo(
dat = list("Geomagnetic Polarity Chron",
"Planktic foraminiferal Primary Biozones"),
xlim = c(6, 2), ylim = c(5.5, 0), pos = list("l", "r"),
rot = 90, skip = "PL4", size = list(5, 4)
) +
# 设置图形主题为经典主题,并定义基础字体大小为16
theme_classic(base_size = 16)
4.时间尺度系统发育树
我们还可以用来可视化系统发育树
# 加载必要的包
library(ggtree) # ggtree包用于绘制系统发育树
library(rphylopic) # rphylopic包用于获取物种的图片
library(phytools) # phytools包提供了一些处理系统发育数据的工具
# 获取脊椎动物系统发育树数据
data(vertebrate.tree) # 使用phytools包中的data()函数加载内置的脊椎动物系统发育树数据
# 修改树上的标签
vertebrate.tree$tip.label[vertebrate.tree$tip.label == "Myotis_lucifugus"] <- "Vespertilioninae"
# 将树中名为"Myotis_lucifugus"的标签改为"Vespertilioninae"
# 创建一个包含物种名称的数据框
vertebrate_data <- data.frame(species = vertebrate.tree$tip.label,
name = vertebrate.tree$tip.label)
# 这个数据框包含了系统发育树上每个物种的名称,用于后续的图片映射
# 绘制系统发育树并添加时间尺度
revts(ggtree(vertebrate.tree, size = 1)) %<+% vertebrate_data +
geom_phylopic(aes(name = name), size = 25) + # 添加物种图片到树节点
scale_x_continuous("Time (Ma)", breaks = seq(-500, 0, 100), # 设置x轴(时间尺度)
labels = seq(500, 0, -100), limits = c(-500, 0),
expand = expansion(mult = 0)) +
scale_y_continuous(guide = NULL) + # 移除y轴的刻度指南
coord_geo_radial(dat = "periods", end = 0.5 * pi) + # 设置径向坐标系
theme_classic(base_size = 16) # 设置图形主题和字体大小
5.其他功能
(1)化石出现范围
# 加载 palaeoverse 库
library(palaeoverse)
# 筛选出四足动物中等级为“属”的记录
occdf <- subset(tetrapods, accepted_rank == "genus")
# 进一步筛选出特定的几个属
occdf <- subset(occdf, accepted_name %in%
c("Eryops", "Dimetrodon", "Diadectes", "Diictodon",
"Ophiacodon", "Diplocaulus", "Benthosuchus"))
# 使用 ggplot 创建图形,横轴表示时间(以百万年前为单位),纵轴表示属的名称
ggplot(data = occdf) +
# 绘制每个属出现的时间范围
geom_points_range(aes(x = (max_ma + min_ma)/2, y = accepted_name)) +
# 将横轴反向,使得更古老的时间显示在图的右侧
scale_x_reverse(name = "Time (Ma)") +
# 移除纵轴的标签
ylab(NULL) +
# 添加地理坐标系统
coord_geo(pos = list("bottom", "bottom"), dat = list("stages", "periods"),
abbrv = list(TRUE, FALSE), expand = TRUE, size = "auto") +
# 设置图形的主题为经典风格,基础字体大小为16
theme_classic(base_size = 16)
这段代码使用了palaeoverse库来绘制化石出现的范围。首先,它筛选出四足动物中等级为“属”的记录,并进一步筛选出特定的几个属,包括"Eryops"、"Dimetrodon"、"Diadectes"、"Diictodon"、"Ophiacodon"、"Diplocaulus"和"Benthosuchus"。
然后,使用ggplot函数创建了一个图形,其中横轴表示时间(以百万年前为单位),纵轴表示这些属的名称。geom_points_range函数用于在图中绘制每个属出现的时间范围,这里通过计算最大和最小年代的平均值来确定每个属在横轴上的位置。
接下来,scale_x_reverse函数将横轴反向,使得更古老的时间显示在图的右侧。ylab(NULL)移除了纵轴的标签。
coord_geo函数添加了一个地理坐标系统,其中pos参数指定了阶段和时期的位置,dat参数提供了阶段和时期的数据,abbrv参数控制是否缩写这些阶段的名称,expand参数设置为TRUE以扩展坐标系统,size参数设置为"auto"自动调整大小。
(2)地质柱状图
# 加载所需的R包
library(rmacrostrat) # 用于获取和处理Macrostrat数据库中的地质数据
library(ggrepel) # 用于在图形中添加并调整文本标签,以避免重叠
# 从Macrostrat数据库中检索圣胡安盆地的白垩纪地层单位
san_juan_units <- get_units(column_id = 489, interval_name = "Cretaceous")
# 为每个地层单位设置x_min和x_max值,定义它们在柱状图上的水平位置
san_juan_units$x_min <- 0
san_juan_units$x_max <- 1
# 对于特定的重叠单位,调整它们的位置以避免完全重叠
san_juan_units$x_max[10] <- 0.5
san_juan_units$x_min[11] <- 0.5
# 计算每个地层单位的底部年龄和顶部年龄的中点,作为文本标签的位置
san_juan_units$m_age <- (san_juan_units$b_age + san_juan_units$t_age) / 2
# 获取岩石类型定义
liths <- def_lithologies()
# 对每个地层单位的岩石类型进行迭代,选择比例最大的岩石类型作为主要岩石类型
san_juan_units$lith_prim <- sapply(san_juan_units$lith, function(df) {
df$name[which.max(df$prop)]
})
# 根据主要岩石类型,从岩石类型定义中匹配相应的填充图案代码
san_juan_units$pattern <- factor(liths$fill[match(san_juan_units$lith_prim, liths$name)])
# 使用ggplot创建柱状图,其中每个地层单位由一个矩形表示,填充图案根据岩石类型变化
ggplot(san_juan_units, aes(ymin = b_age, ymax = t_age, xmin = x_min, xmax = x_max)) +
geom_rect(aes(fill = pattern), color = "black") + # 绘制矩形,填充图案根据岩石类型
scale_fill_geopattern() + # 应用图案填充
# 添加地层单位的名称作为文本标签,并调整其位置和外观
geom_text_repel(aes(x = x_max, y = m_age, label = unit_name),
size = 3.5, hjust = 0, force = 2,
min.segment.length = 0, direction = "y",
nudge_x = rep_len(x = c(2, 3), length.out = 17)) +
# 将y轴设置为逆序(最新的地质时间在上方),并定义其范围和刻度
scale_y_reverse(limits = c(145, 66), n.breaks = 10, name = "Time (Ma)") +
# 应用经典主题,移除图例、x轴线和刻度
theme_classic(base_size = 16) +
theme(legend.position = "none",
axis.line.x = element_blank(),
axis.title.x = element_blank(),
axis.text.x = element_blank(),
axis.ticks.x = element_blank()) +
# 添加地质时间尺度的坐标系
coord_geo(pos = "left", dat = list("stages"), rot = 90)
ok,本次内容到此为止,有什么问题大家可以评论区交流