Many packages exist to visualize trait data for biological species. deeptime similarly has a few novel ways to help you plot your data in useful ways. We’ll first load some packages and example data so we can demonstrate some of this functionality.
# Load deeptime
library(deeptime)
# Load other packages
library(ggplot2)
library(dplyr)
# Load dispRity for example data
library(dispRity)
data(demo_data)
# Load paleotree for example data
library(phytools)
data(mammal.tree)
data(mammal.data)
A common way to visualize trait data, especially for fossil species,
is to show the two-dimensional trait distribution for several time
intervals. This allows the viewer to easily compare the trait
distribution through time. However, producing such a plot has
historically been very time intensive, often involving the use of custom
code and image editing software (e.g., Inkscape). While a single function to
accomplish such a visualization still does not exist for
{ggplot2}
(yet…), the coord_trans_xy()
function can be used to generate a similar plot with sheared trait space
across several time intervals.
# make transformer
library(ggforce)
trans <- linear_trans(shear(.75, 0))
# prepare data to be plotted
crinoids <- as.data.frame(demo_data$wright$matrix[[1]][, 1:2])
crinoids$time <- "before extinction"
crinoids$time[demo_data$wright$subsets$after$elements] <- "after extinction"
# a box to outline the trait space
square <- data.frame(V1 = c(-.6, -.6, .6, .6), V2 = c(-.4, .4, .4, -.4))
ggplot() +
geom_segment(
data = data.frame(
x = -.6, y = seq(-.4, .4, .2),
xend = .6, yend = seq(-0.4, .4, .2)
),
aes(x = x, y = y, xend = xend, yend = yend),
linetype = "dashed", color = "grey"
) +
geom_segment(
data = data.frame(
x = seq(-.6, .6, .2), y = -.4,
xend = seq(-.6, .6, .2), yend = .4
),
aes(x = x, y = y, xend = xend, yend = yend),
linetype = "dashed", color = "grey"
) +
geom_polygon(data = square, aes(x = V1, y = V2), fill = NA, color = "black") +
geom_point(data = crinoids, aes(x = V1, y = V2), color = "black") +
coord_trans_xy(trans = trans, expand = FALSE) +
labs(x = "PCO1", y = "PCO2") +
theme_classic() +
facet_wrap(~time, ncol = 1, strip.position = "right") +
theme(panel.spacing = unit(1, "lines"), panel.background = element_blank())
The disparity_through_time()
function accomplishes
nearly all of the work for you if you are comfortable plotting within
the {lattice}
framework (base R). Note that it may take
some tweaking (especially the aspect
argument) to get the
results to look the way you want.
crinoids$time <- factor(crinoids$time)
disparity_through_time(time ~ V2 * V1,
data = crinoids, groups = time, aspect = c(1.5, .6),
xlim = c(-.6, .6), ylim = c(-.5, .5),
col.regions = "lightyellow", col.point = c("red", "blue"),
par.settings = list(
axis.line = list(col = "transparent"),
layout.heights =
list(
top.padding = -20, main.key.padding = 0,
key.axis.padding = 0, axis.xlab.padding = 0,
xlab.key.padding = 0, key.sub.padding = 0,
bottom.padding = -20
),
layout.widths =
list(
left.padding = -10, key.ylab.padding = 0,
ylab.axis.padding = 0, axis.key.padding = 0,
right.padding = 0
)
)
)
Often, trait data will be accompanied with a phylogeny. You may want
to visualize both your phylogeny, the traits of your species, and the
evolution of the trait along your phylogeny. To accomplish this, you can
create a two-dimensional phylomorphospace. The {phytools}
package has the phytools::phylomorphospace()
function for
accomplishing this in base R. The geom_phylomorpho()
function in deeptime will help you accomplish this with
ggplot()
. Note that labels can be added using
geom_label()
or ggrepel::geom_label_repel()
,
but they are not demonstrated here because they would obscure the
phylogenetic relationships.