首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绘制素食者的树状图::ggplot ()

绘制素食者的树状图::ggplot ()
EN

Stack Overflow用户
提问于 2022-09-08 18:17:59
回答 2查看 90关注 0票数 1

Vegan::嗜好者()有一个非常好的绘图方法,它创建了一个平均异同点的树状图。如何将输出合并到ggplot中才能完全控制美学?下面是一些使用沙丘的示例代码。举个例子,我想用“Use”(参见Dune.env中的因素)来重新创建每个管理级别上的ggplot和颜色的树状图。

代码语言:javascript
复制
# 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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-08 18:41:38

?vegan:::plot.meandist中可以清楚地看出,hclust函数用于kind = "dendrogram"。重新创造:

代码语言:javascript
复制
zz <- hclust(as.dist(dissim), method = "average") #use desired method, "average" is the default in vegan:::plot.meandist

现在,要使用ggplot来可视化树:

代码语言:javascript
复制
library(ggdendro)

从树中创建一个data.frame:

代码语言:javascript
复制
dd <- as.dendrogram(zz) 
dd <- dendro_data(zz) 

从不同的矩阵中获取对角线元素,因为它们表示集群内的可变性(见@Jari下面的注释):

代码语言:javascript
复制
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结束,而是在适当的距离处结束。

代码语言:javascript
复制
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数据添加到段数据中:

代码语言:javascript
复制
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

需要进行类似的操作才能创建适当的标签协同:

代码语言:javascript
复制
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

现在实际的情节是:

代码语言:javascript
复制
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) 

感谢@的评论!

票数 2
EN

Stack Overflow用户

发布于 2022-09-11 16:42:04

去葡萄糖包是为了帮助完成这些任务而设计的(而且它是基于ggdendro的代码--这是一个比ggdendro更灵活和简单的代码库)。您可以看到关于ggplot2集成在守护神中的一节。

由于我自己的计算机(旧的linux )的问题,我无法安装纯素来重现您的示例。但是,如果我使用类似的数据,下面是一个用法示例:

代码语言:javascript
复制
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

获取树状图的代码:

代码语言:javascript
复制
library(dendextend)
library(ggplot2)
ggplot(as.dendrogram(zz))

输出(同样,与上面的分析不同,但您可以使用自己的代码来修复它)

这也支持对分支、标签、旋转等进行着色。你可以去这里的守护神了解更多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73653501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档