首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ggtree:有颜色的树枝和尖端

ggtree:有颜色的树枝和尖端
EN

Stack Overflow用户
提问于 2020-08-19 02:23:16
回答 2查看 994关注 0票数 0

亲爱的堆栈溢出社区,

我想请你帮我解决我的问题。我正在使用ggtree包绘制系统发生树,我想在这些图上显示更多信息,就像论文中常见的那样。我特别感兴趣的是,有一棵带有彩色树枝(具有混合梯度)的树,它显示了连续性状的一些变化,并且树枝末端的某些点用颜色(或形状)表示离散性状。虽然我可以分别做这两件事,但我试图将这两件事都放在一个情节中是完全失败的。你能帮帮忙吗?

在这里,我将为您提供可重现的示例。让我们有一个随机树(tree.1),其中有9个物种和一些随机的分支长度,以及关于这些物种的随机表(data1):

代码语言:javascript
复制
###STACK EXAMPLE

source("https://bioconductor.org/biocLite.R")
biocLite("ggtree")
library(ggtree)

tree.1<-read.tree(text="(spec1:2.2,((spec2:1.8,(spec9:1.4,(spec3:1.3,spec5:1.3):0.1):0.4):0.2,(spec8:1.7,(spec6:1.5,(spec7:1,spec4:1):0.5):0.2):0.3):0.2);")

data1<-data.frame(row.names = c("spec1","spec2","spec3","spec4","spec5","spec6","spec7","spec8","spec9"),
                  "tip" = c("spec1","spec2","spec3","spec4","spec5","spec6","spec7","spec8","spec9"),
                  "colour" = c("red", "red", "blue", "red", "red", "blue", "blue", "red", "blue"),
                  "fylo.signal" = c(0.1, 1.0, 0.3, 0.6, 0.2, 0.8, 0.7, 0.3, 0.6))

如果你看一下数据,这里有colour列,它是我的离散变量,还有fylo.signal,它是一个随机连续变量。

为了制作这些图,我遵循了两个示例(this one表示分支的渐变颜色,and my old question表示分支末端的点的颜色)。

我可以从颜色渐变分支开始。在绘制数据之前,对我来说有一点黑箱,但我想我至少理解了它的作用。首先,我只提取连续变量(b)并计算树的“节点”(a),然后计算树中所有“非尖端”节点的连续变量,即不仅仅是末尾。然后我将数据合并在一起。

代码语言:javascript
复制
b <- as.matrix(data1)[,3]
a <- data.frame(node = nodeid(tree.1, names(b)),
                signal = b)
fit2 <- phytools::fastAnc(tree.1,b,vars=TRUE,CI=TRUE)
c <- data.frame(node = names(fit2$ace), signal = fit2$ace)
d.1 <- rbind(a, c)
d.1$node <- as.numeric(d.1$node)
d.1$signal <- as.numeric(d.1$signal)

在这之后,我还插入了离散变量(并且我使内部节点具有这个“颜色”的"NA“):

代码语言:javascript
复制
colour.vector <- c(data1$colour, rep(NA, nrow(d.1)-nrow(data1)))
d.2 <- cbind(d.1, colour.vector)
d.2

..。然后我将这些数据插入到系统树本身:

代码语言:javascript
复制
tree.2 <- dplyr::full_join(tree.1, d.2, by = 'node')

现在开始绘图。我可以用树枝的渐变颜色来表示我的连续变量。下面的代码生成this plot

代码语言:javascript
复制
## example1 (SEPARATE TREES)

t1 <- ggtree(tree.2, aes(color=signal), layout = 'circular', 
             ladderize = FALSE, continuous = TRUE, size=2) +
  ggplot2::scale_color_gradientn(colours=c('red', 'orange', 'green', 'cyan', 'blue')) +
  geom_tiplab(hjust = -.1, offset=.1) + 
  theme(legend.position = c(.05, .85))
t1

..。当我尝试将我的离散变量绘制为分支末端的不同颜色的点时(请注意,即使颜色是反转的,它实际上遵循我使用的数据集):this image

代码语言:javascript
复制
t2 <- ggtree(tree.2, layout = 'circular') + geom_tiplab(hjust = -.1, offset=.1) 
t2 <- t2 %<+% data1 + geom_tippoint(pch=16, size=4, aes(col=colour))
t2

但是当我尝试将这两者结合起来时,会产生一个错误:

代码语言:javascript
复制
## example 1.5 (ERROR)

t3 <- t1 %<+% data1 + geom_tippoint(pch=16, size=4, aes(col=colour))
t3 ## Error: Discrete value supplied to continuous scale

我猜当使用函数"aes“制作树时,它不能被绘图的子部分覆盖?我不明白这一点。我最好的选择是下面的代码:

代码语言:javascript
复制
## example 2 (WRONG ORDER OF COLOURS)
t4 <- ggtree(tree.2, aes(color=signal), layout = 'circular', 
             ladderize = FALSE, continuous = TRUE, size=2) +
  ggplot2::scale_color_gradientn(colours=c('red', 'orange', 'green', 'cyan', 'blue')) +
  geom_tiplab(hjust = -.1, offset=.1) + 
  theme(legend.position = c(.05, .85)) +
  geom_tippoint(pch=16, size=4, color=as.factor(colour.vector[1:9]))
t4

..。这实际上就是this WRONG picture。分支末端的点是彩色的,但不是根据原始数据集中的颜色。它们遵循数据集中的顺序,但没有分配给正确的“物种”。根据来自"spec1“数据集的序列逆时针对物种进行着色。我不能让ggtree实际跟随“种”,就像我在上面使用相同代码的第二个图一样。

有人能帮上忙吗?

EN

回答 2

Stack Overflow用户

发布于 2020-08-20 00:20:33

所以我想我找到了一个解决方案。我只是丢弃了ggtree包,转而使用phytools。更少的代码,更优雅。如果有人感兴趣,这里是(我刚刚将原始数据集的“颜色”替换为"breeding.range“和适当的值,顺序相同):

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

tree.1<-read.tree(text="(spec1:2.2,((spec2:1.8,(spec9:1.4,(spec3:1.3,spec5:1.3):0.1):0.4):0.2,(spec8:1.7,(spec6:1.5,(spec7:1,spec4:1):0.5):0.2):0.3):0.2);")

data1<-data.frame(row.names = c("spec1","spec2","spec3","spec4","spec5","spec6","spec7","spec8","spec9"),
                  "breeding.range" = c("tropical", "tropical", "temperate", "tropical", "tropical", "temperate", "temperate", "tropical", "temperate"),
                  "fylo.signal" = c(0.1, 1.0, 0.3, 0.6, 0.2, 0.8, 0.7, 0.3, 0.6))

var.cont<-setNames(data1[,2],rownames(data1))
var.disc<-setNames(data1[,1],rownames(data1))
var.disc<-as.factor(var.disc)
matrix.disc<-to.matrix(var.disc,levels(var.disc))
matrix.disc<-matrix.disc[tree.1$tip.label,]

obj<-contMap(tree.1,var.cont,plot=FALSE)

plotTree(tree.1,type="fan",ftype="i",offset=2,fsize=0.9)

plot(obj$tree,colors=obj$cols,type="fan",add=TRUE,ftype="off",lwd=3,
     xlim=get("last_plot.phylo",envir=.PlotPhyloEnv)$x.lim,
     ylim=get("last_plot.phylo",envir=.PlotPhyloEnv)$y.lim)

tiplabels(pie=matrix.disc,piecol=palette()[c(4,2)],cex=0.4)
票数 0
EN

Stack Overflow用户

发布于 2020-08-20 05:11:51

(我之前的回答,现在删除了,确实不是您所要求的。)

首先,快速修复以在不使用NAs的情况下生成d.1

代码语言:javascript
复制
d.1 <- rbind(
    mutate(a, signal = as.numeric(signal)),
    c
)

...and可以像这样确保提示标签的正确顺序。

代码语言:javascript
复制
cols <- sapply( # colour.vector, but with names of colours
    colour.vector,
    function(val)
        if (is.na(val))    NA
        else if (val == 1) 'blue'
        else               'red'
)
tiplabel_order <- as.numeric(gsub('spec', '', tree.2@phylo$tip.label))

t4 <- ggtree(tree.2, aes(color = signal), layout = 'circular', 
             ladderize = FALSE, continuous = TRUE, size = 2) +
  ggplot2::scale_color_gradientn(colours=c('red', 'orange', 'green', 'cyan', 'blue')) +
  geom_tiplab(hjust = -.1, offset=.1) + 
  theme(legend.position = c(.05, .85)) +
  geom_tippoint(pch=16, size=4, color=as.factor(cols[tiplabel_order]))
t4
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63474497

复制
相关文章

相似问题

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