亲爱的堆栈溢出社区,
我想请你帮我解决我的问题。我正在使用ggtree包绘制系统发生树,我想在这些图上显示更多信息,就像论文中常见的那样。我特别感兴趣的是,有一棵带有彩色树枝(具有混合梯度)的树,它显示了连续性状的一些变化,并且树枝末端的某些点用颜色(或形状)表示离散性状。虽然我可以分别做这两件事,但我试图将这两件事都放在一个情节中是完全失败的。你能帮帮忙吗?
在这里,我将为您提供可重现的示例。让我们有一个随机树(tree.1),其中有9个物种和一些随机的分支长度,以及关于这些物种的随机表(data1):
###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),然后计算树中所有“非尖端”节点的连续变量,即不仅仅是末尾。然后我将数据合并在一起。
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“):
colour.vector <- c(data1$colour, rep(NA, nrow(d.1)-nrow(data1)))
d.2 <- cbind(d.1, colour.vector)
d.2..。然后我将这些数据插入到系统树本身:
tree.2 <- dplyr::full_join(tree.1, d.2, by = 'node')现在开始绘图。我可以用树枝的渐变颜色来表示我的连续变量。下面的代码生成this plot
## 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:
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但是当我尝试将这两者结合起来时,会产生一个错误:
## 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“制作树时,它不能被绘图的子部分覆盖?我不明白这一点。我最好的选择是下面的代码:
## 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实际跟随“种”,就像我在上面使用相同代码的第二个图一样。
有人能帮上忙吗?
发布于 2020-08-20 00:20:33
所以我想我找到了一个解决方案。我只是丢弃了ggtree包,转而使用phytools。更少的代码,更优雅。如果有人感兴趣,这里是(我刚刚将原始数据集的“颜色”替换为"breeding.range“和适当的值,顺序相同):
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)发布于 2020-08-20 05:11:51
(我之前的回答,现在删除了,确实不是您所要求的。)
首先,快速修复以在不使用NAs的情况下生成d.1:
d.1 <- rbind(
mutate(a, signal = as.numeric(signal)),
c
)...and可以像这样确保提示标签的正确顺序。
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]))
t4https://stackoverflow.com/questions/63474497
复制相似问题