Today is my birthday and it happened to be the release day of Bioconductor 3.3. It’s again the time to reflect what I’ve done in the past year.
I extended the subview function to support embed image file in a ggplot
object.
set.seed(123)
d = data.frame(x=rnorm(10), y=rnorm(10))
imgfile <- tempfile(, fileext=".png")
download.file("https://avatars1.githubusercontent.com/u/626539?v=3&u=e731426406dd3f45a73d96dd604bc45ae2e7c36f&s=140",
destfile=imgfile, mode='wb')
p = ggplot(d, aes(x, y))
subview(p, imgfile, x=d$x[1], y=d$y[1]) + geom_point(size=5)
本文受魏太云(@cloud_wei)的邀请,最初在2015年发表于统计之都。
进化树看起来和层次聚类很像。有必要解释一下两者的一些区别。
层次聚类的侧重点在于分类,把距离近的聚在一起。而进化树的构建可以说也是一个聚类过程,但侧重点在于推测进化关系和进化距离(evolutionary distance)。
层次聚类的输入是距离,比如euclidean或manhattan距离。把距离近的聚在一起。而进化树推断是从生物序列(DNA或氨基酸)的比对开始。最简单的方法是计算一下序列中不匹配的数目,称之为hamming distance(通常用序列长度做归一化),使用距离当然也可以应用层次聚类的方法。进化树的构建最简单的方法是非加权配对平均法(Unweighted Pair Group Method with Arithmetic Mean, UPGMA),这其实是使用average linkage的层次聚类。这种方法在进化树推断上现在基本没人用。更为常用的是邻接法(neighbor joining),两个节点距离其它节点都比较远,而这两个节点又比较近,它们就是neighbor,可以看出neighbor不一定是距离最近的两个节点。真正做进化的人,这个方法也基本不用。现在主流的方法是最大似然法(Maximum likelihood, ML),通过进化模型(evolutionary model)估计拓朴结构和分支长度,估计的结果具有最高的概率能够产生观测数据(多序列比对)。另外还有最大简约法和贝叶斯推断等方法用于构建进化树。
Phylip is also a widely used tree format, which contains taxa sequences with Newick tree text.
In ggtree
, we can use read.phylip()
function to parse the file and use ggtree()
to visualize the tree.
This is a question from ggtree
user. In ape
and phytools
, it’s easy to label edge using the edgelabels
function.
set.seed(1)
tr = rtree(30)
library(ape)
plot(tr, main="ape")
edgelabels()
ggtree
implemented a function, subview
, that can add subplots on a
ggplot2 object. It had successful applied to plot pie graphs on map.
set.seed(2016-01-04)
tr <- rtree(30)
tr <- groupClade(tr, node=45)
p <- ggtree(tr, aes(color=group)) + geom_tippoint()
cpos <- get_clade_position(p, node=45)
p1 <- p + geom_hilight(node=45)
p2 <- with(cpos, p+xlim(xmin, xmax*1.01)+ylim(ymin, ymax))
with(cpos, subview(p2+geom_tiplab(), p1+theme_transparent(), x=xmin+(xmax-xmin)*.15, y=ymin+(ymax-ymin)*.85))