1

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

这是我试图实现的事情类型的一个例子:

我已成功运行聚类分析,但正在努力按照我想要的方式绘制树状图。每当我绘制树状图时,它都会按顺序绘制树状图的叶子(如此处所示)。但是,我需要叶子从沉积物核心顶部按深度绘制,以便在我检查过的核心的每个深度都有一片叶子,并且在树状图中我缺少样本的地方存在间隙(如此处显示)。(注意这里没有显示 y 轴,因为树状图将连接到图表的其余部分,其中已经包含 y 轴。)

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

我的数据

这是我在下面的代码中用来计算距离矩阵的数据。(为很长的输入道歉!)

我绘制树状图的代码

# 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)
4

1 回答 1

0

实际深度映射到 中的 x 值ddata$labels,因此您可以将 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)

我们得到:

在此处输入图像描述

于 2020-12-08T21:43:43.237 回答