有没有办法在 ape/phytools 中手动调整系统发育的颜色渐变边界?

问题描述

我正在尝试使用 apephytools 可视化系统发育最小二乘回归的结果。具体来说,我一直在尝试创建一个用于预测目的的回归方程,我正在研究系统发育信号对残差的影响(以及方程的准确性)。我一直在使用类似于以下的代码来绘制结果(尽管这里针对虚拟数据进行了重新调整)。

library("ape")
library("phytools")
orig_tree<-rtree(n=20)
plot(orig_tree)
values<-data.frame("residuals"=runif(20,min=-1,max=1),row.names=orig_tree$tip.label)
values<-setNames(values$residuals,rownames(values))
residualsignalfit<-fastAnc(orig_tree,values,vars=TRUE,CI=TRUE)
obj<-contMap(orig_tree,plot=FALSE)
plot(obj,fsize=.25)

然而,问题在于我有几个物种相对于数据集的其余部分表现出极高的残差。因为颜色梯度的最小值和最大值被设置为实际列的最小值和最大值,这会消除 90% 数据集之间的所有对比度,以可视化少数极端异常值。与上面的 obj 相比,下面的代码重现了我的意思。

values2<-values
values2[6]<--2
values2[7]<-2
residualsignalfit2<-fastAnc(orig_tree,values2,CI=TRUE)
obj2<-contMap(orig_tree,plot=FALSE)
plot(obj2,fsize=.25)

这导致该图看起来好像系统发育信号比实际情况少得多,因为它会将除最极端的离群点之外的所有点着色为颜色相似。

我试图找出一种方法来设置颜色渐变的最小值和最大值,以便任何值≤ -1 是最大可能的红色值,任何值 ≥ 1 是可能的最大蓝色值,从而允许更大的对比度在剩余的残差中。我尝试使用命令

plot(obj2,fsize=.25,lims=c(-1,1))

但是正如您从这段代码中看到的那样,这没有任何作用。我知道 ggplot2一个选项可以根据用户输入的值重新调整颜色渐变,但我似乎无法弄清楚如何从 apephytools 绘制系统发育对象在 ggplot2 中。

鉴于此,有没有办法在ape/phytools中操纵颜色渐变模式,以便可以任意设置颜色渐变的最大和最小边界?

解决方法

您可以通过“挤压”某些任意边界(在我的示例中为 90% 分位数)之间的值来调整颜色渐变模式,以调整 phytools::contMap 中的颜色渐变:

## The vector of values with two outliers
values_outliers <- values
values_outliers[6] <- -10
values_outliers[7] <- 10

## The original heat plot object
contMap_with_outliers <- contMap(orig_tree,values_outliers,plot = FALSE)

plot(contMap_with_outliers,fsize = .25)

## Removing the outliers (setting them within to the 90% CI)
values_no_outliers <- values_outliers
## Find the 90% boundaries
boundaries <- quantile(values_no_outliers,probs = c(0.05,0.95))
## Changing the values below the lowest boundary
values_no_outliers <- ifelse(values_no_outliers < boundaries[1],boundaries[1],values_no_outliers)
## Changing the values above the highest boundary
values_no_outliers <- ifelse(values_no_outliers > boundaries[2],boundaries[2],values_no_outliers)

## The heat plot object without outliers
contMap_without_outliers <- contMap(orig_tree,values_no_outliers,plot = FALSE)

plot(contMap_without_outliers,fsize = .25)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...