deeptime extends the functionality of other plotting
packages (notably {ggplot2}
) to help facilitate the
plotting of data over long time intervals, including, but not limited
to, geological, evolutionary, and ecological data. The primary goal of
deeptime is to enable users to add highly customizable
timescales to their visualizations. Other functions are also included to
assist with other areas of deep time visualization.
# get the stable version from CRAN
install.packages("deeptime")
# or get the development version from github
# install.packages("devtools")
::install_github("willgearty/deeptime") devtools
library(deeptime)
library(ggplot2)
library(dplyr)
The main function of deeptime is
coord_geo()
, which functions just like
coord_trans()
from {ggplot2}
. You can use this
function to add highly customizable timescales to a wide variety of
ggplots.
library(divDyn)
data(corals)
# this is not a proper diversity curve but it gets the point across
<- corals %>% filter(stage != "") %>%
coral_div group_by(stage) %>%
summarise(n = n()) %>%
mutate(stage_age = (stages$max_age[match(stage, stages$name)] +
$min_age[match(stage, stages$name)])/2)
stagesggplot(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)
# Load packages
library(gsloid)
# Plot two different timescales
ggplot(lisiecki2005) +
geom_line(aes(x = d18O, y = Time / 1000), orientation = "y") +
scale_y_reverse("Time (Ma)") +
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)
+
) theme_classic(base_size = 16)
# Load packages
library(ggtree)
library(rphylopic)
# Get vertebrate phylogeny
library(phytools)
data(vertebrate.tree)
$tip.label[vertebrate.tree$tip.label ==
vertebrate.tree"Myotis_lucifugus"] <- "Vespertilioninae"
<- data.frame(species = vertebrate.tree$tip.label,
vertebrate_data name = vertebrate.tree$tip.label)
# Plot the phylogeny with a timescale
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),
labels = seq(500, 0, -100), limits = c(-500, 0),
expand = expansion(mult = 0)) +
scale_y_continuous(guide = NULL) +
coord_geo_radial(dat = "periods", end = 0.5 * pi) +
theme_classic(base_size = 16)
library(palaeoverse)
# Filter occurrences
<- subset(tetrapods, accepted_rank == "genus")
occdf <- subset(occdf, accepted_name %in%
occdf c("Eryops", "Dimetrodon", "Diadectes", "Diictodon",
"Ophiacodon", "Diplocaulus", "Benthosuchus"))
# Plot occurrences
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") +
theme_classic(base_size = 16)
# Load packages
library(rmacrostrat)
library(ggrepel)
# Retrieve the Macrostrat units in the San Juan Basin column
<- get_units(column_id = 489, interval_name = "Cretaceous")
san_juan_units
# Specify x_min and x_max in dataframe
$x_min <- 0
san_juan_units$x_max <- 1
san_juan_units# Tweak values for overlapping units
$x_max[10] <- 0.5
san_juan_units$x_min[11] <- 0.5
san_juan_units
# Add midpoint age for plotting
$m_age <- (san_juan_units$b_age + san_juan_units$t_age) / 2
san_juan_units
# Get lithology definitions
<- def_lithologies()
liths
# Get the primary lithology for each unit
$lith_prim <- sapply(san_juan_units$lith, function(df) {
san_juan_units$name[which.max(df$prop)]
df
})
# Get the pattern codes for those lithologies
$pattern <- factor(liths$fill[match(san_juan_units$lith_prim, liths$name)])
san_juan_units
# Plot with pattern fills
ggplot(san_juan_units, aes(ymin = b_age, ymax = t_age,
xmin = x_min, xmax = x_max)) +
# Plot units, patterned by rock type
geom_rect(aes(fill = pattern), color = "black") +
scale_fill_geopattern() +
# Add text labels
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)) +
# Reverse direction of y-axis
scale_y_reverse(limits = c(145, 66), n.breaks = 10, name = "Time (Ma)") +
# Theming
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()) +
# Add geological time scale
coord_geo(pos = "left", dat = list("stages"), rot = 90)