如何按给定值(沉积物芯中的深度)而不是按顺序绘制树状图叶子?

How do I plot dendrogram leaves by a given value (depth in a sediment core) rather than in sequential order?

我正在处理生态数据(沉积岩芯中不同深度存在的不同硅藻物种的丰度百分比),并希望将结果与代表我进行的层次聚类分析 (CONISS) 结果的树状图一起绘制将用于将核心拆分为生态区。

这是我要实现的目标类型的示例:

我已经成功地 运行 进行了聚类分析,但是我正在努力按照我想要的方式绘制树状图。每当我绘制树状图时,它都会按顺序 (as shown here). However, I need the leaves to plot by depth from the top of the sediment core so that there is a leaf present at each depth of the core that I have examined and so that there are gaps in the dendrogram where I have missing samples (as shown here) 绘制树状图的叶子。 (请注意,此处没有显示 y-axis,因为树状图将连接到图表的其余部分,其中已经包含 y-axis。)

我设法使用 plot.chclust 通过 rioja 包创建了后一个图,并为 xvar 参数提供了叶子的深度。然而,我已经使用 ggplot(以及 tidypaleo 包的帮助)构建了我的图表的其余部分(物种丰度数据、PCA 结果等),然后使用 cowplot 将它的各个方面结合起来。我需要能够通过 ggplot 创建树状图,以便将其添加到我的主图中。我已经研究了 ggdendro 和 dendextend 包,但找不到使用这些包根据深度绘制树状图的方法。这可能吗?这些软件包是否具有我不知道的执行此操作的功能?我开始研究这些包以及 as.dendrogram 的源代码,看看我是否可以想出一种方法来修改函数以按深度绘制叶子,但这超出了我的技能水平。我想知道是否有人有解决方案使我能够按沉积岩心的深度而不是按顺序绘制我的树状图?

我的数据

This is the data that I have used to calculate the distance matrix in the code below.(抱歉输入太长!)

我绘制树状图的代码

# Load requirements
library(vegan) # designdist and chclust
library(rioja) # plot.chclust
library(ggplot2)
library(ggdendro) # dendro_data
library(dplyr)
library(tibble)

# Calculate distance matrix
dist_matrix <- designdist(coniss_data, method = "A+B-2*J", terms = "quadratic")

# Run cluster analysis
coniss_results <- chclust(dist_matrix, method = "coniss")


# Plot with rioja ---------------------------------------------------------

# Isolate depths
coniss_depths <- coniss_data %>%
  rownames_to_column("depth") %>%
  mutate(depth = as.numeric(depth)) %>%
  select(., "depth")

# Plot
plot(
  coniss_results,
  hang = -0.01, # make leaves extend to 0 and labels hang down from there
  horiz = TRUE, # rotate plot
  x.rev = TRUE, # reverse depths
  xvar = coniss_depths$depth, # plot leaves by depth of sediment core
  labels = FALSE,
  cex.axis = 0.8,
  tcl = -0.1
)


# Plot with ggdendro ------------------------------------------------------

# Extract dendrogram data
ddata <- dendro_data(coniss_results, type = "rectangle")

# Plot
ggplot(segment(ddata)) +
  geom_segment(aes(x = x, y = y, xend = xend, yend = yend)) +
  coord_flip() +
  scale_y_continuous(expand = c(0, 0)) +
  scale_x_reverse(breaks = NULL,
                  labels = NULL) +
  labs(x = "",
       y = "Total sum of squares") +
  theme_classic(8)

实际深度映射到 ddata$labels 中的 x 值,因此您可以将 x 值反向映射到实际深度。一个方便的方法是使用 approxfun:

new_x <- approxfun(ddata$labels$x, as.numeric(as.character(ddata$labels$label))) 
ddata$segments$x <- new_x(ddata$segments$x)
ddata$segments$xend <- new_x(ddata$segments$xend)

现在使用相同的绘图代码:

ggplot(segment(ddata)) +
  geom_segment(aes(x = x, y = y, xend = xend, yend = yend)) +
  coord_flip() +
  scale_y_continuous(expand = c(0, 0)) +
  scale_x_reverse(breaks = NULL,
                  labels = NULL) +
  labs(x = "",
       y = "Total sum of squares") +
  theme_classic(8)

我们得到: