Vegan::嗜好者()有一个非常好的绘图方法,它创建了一个平均异同点的树状图。如何将输出合并到ggplot中才能完全控制美学?下面是一些使用沙丘的示例代码。举个例子,我想用“Use”(参见Dune.env中的因素)来重新创建每个管理级别上的ggplot和颜色的树状图。
# Species and environmental data
require(vegan)
dune <- read.delim ('https://raw.githubusercontent.com/zdealveindy/anadat-r/master/data/dune2.spe.txt', row.names = 1)
dune.env <- read.delim ('https://raw.githubusercontent.com/zdealveindy/anadat-r/master/data/dune2.env.txt', row.names = 1)
data(dune)
data(dune.env)
dune_dist <- vegdist(dune, method = "bray", na.rm=T)
dissim <- meandist(dune_dist, grouping = dune.env$Management)
plot(dissim)发布于 2022-09-08 18:41:38
从?vegan:::plot.meandist中可以清楚地看出,hclust函数用于kind = "dendrogram"。重新创造:
zz <- hclust(as.dist(dissim), method = "average") #use desired method, "average" is the default in vegan:::plot.meandist现在,要使用ggplot来可视化树:
library(ggdendro)从树中创建一个data.frame:
dd <- as.dendrogram(zz)
dd <- dendro_data(zz) 从不同的矩阵中获取对角线元素,因为它们表示集群内的可变性(见@Jari下面的注释):
data.frame(diag = diag(dissim)) %>%
rownames_to_column("label") -> dissim_diag
dissim_diag
label diag
1 BF 0.4159972
2 HF 0.4418115
3 NM 0.6882438
4 SF 0.5813015现在需要更改段数据,这样叶子就不会以0结束,而是在适当的距离处结束。
segment(dd)
x y xend yend
1 1.875 0.7412760 1.00 0.7412760
2 1.000 0.7412760 1.00 0.0000000
3 1.875 0.7412760 2.75 0.7412760
4 2.750 0.7412760 2.75 0.5960416
5 2.750 0.5960416 2.00 0.5960416
6 2.000 0.5960416 2.00 0.0000000
7 2.750 0.5960416 3.50 0.5960416
8 3.500 0.5960416 3.50 0.4736637
9 3.500 0.4736637 3.00 0.4736637
10 3.000 0.4736637 3.00 0.0000000
11 3.500 0.4736637 4.00 0.4736637
12 4.000 0.4736637 4.00 0.0000000换句话说,如果x是一个整数,yend是0,我们需要将yend更改为适当的距离。下面的代码是在两个联接中完成的。第一个联接添加label(dd)数据,第二个联接将dissim_diag数据添加到段数据中:
segment_data <- segment(dd) %>%
left_join(
label(dd),
by = c("xend" = "x",
"yend" = "y")) %>%
left_join(dissim_diag) %>%
mutate(yend = pmax(yend, diag, na.rm = TRUE)) #use as yend whichever is higher yend or diag, ignoring NA.
segment_data
x y xend yend label diag
1 1.875 0.7412760 1.00 0.7412760 <NA> NA
2 1.000 0.7412760 1.00 0.6882438 NM 0.6882438
3 1.875 0.7412760 2.75 0.7412760 <NA> NA
4 2.750 0.7412760 2.75 0.5960416 <NA> NA
5 2.750 0.5960416 2.00 0.5960416 <NA> NA
6 2.000 0.5960416 2.00 0.5813015 SF 0.5813015
7 2.750 0.5960416 3.50 0.5960416 <NA> NA
8 3.500 0.5960416 3.50 0.4736637 <NA> NA
9 3.500 0.4736637 3.00 0.4736637 <NA> NA
10 3.000 0.4736637 3.00 0.4159972 BF 0.4159972
11 3.500 0.4736637 4.00 0.4736637 <NA> NA
12 4.000 0.4736637 4.00 0.4418115 HF 0.4418115需要进行类似的操作才能创建适当的标签协同:
text_data <- label(dd) %>%
left_join(dissim_diag) %>%
mutate(y = diag,
group = factor(rep(c("one", "two"), 2))) #just some random groups to color by现在实际的情节是:
ggplot(segment_data) +
geom_segment(aes(x = x,
y = y,
xend = xend,
yend = yend)) +
theme_dendro() +
theme(axis.line.y = element_line(),
axis.ticks.y = element_line(),
axis.text.y = element_text()) +
geom_text(aes(x = x,
y = y,
label = label,
color = group),
angle = -90, hjust = 0,
data = text_data)

感谢@的评论!
发布于 2022-09-11 16:42:04
去葡萄糖包是为了帮助完成这些任务而设计的(而且它是基于ggdendro的代码--这是一个比ggdendro更灵活和简单的代码库)。您可以看到关于ggplot2集成在守护神中的一节。
由于我自己的计算机(旧的linux )的问题,我无法安装纯素来重现您的示例。但是,如果我使用类似的数据,下面是一个用法示例:
dune <- read.delim ('https://raw.githubusercontent.com/zdealveindy/anadat-r/master/data/dune2.spe.txt', row.names = 1)
dune.env <- read.delim ('https://raw.githubusercontent.com/zdealveindy/anadat-r/master/data/dune2.env.txt', row.names = 1)
dissim <- dist(dune) # a hack, just because I can't get vegan to work
zz <- hclust(as.dist(dissim), method = "average") #use desired method, "average" is the default in vegan:::plot.meandist获取树状图的代码:
library(dendextend)
library(ggplot2)
ggplot(as.dendrogram(zz))输出(同样,与上面的分析不同,但您可以使用自己的代码来修复它)

这也支持对分支、标签、旋转等进行着色。你可以去这里的守护神了解更多。
https://stackoverflow.com/questions/73653501
复制相似问题