比如下面的代码:

require(ggplot2)
d <- data.frame(x=c(0, 0.002, 0.00575), y = 1:3)
p <- ggplot(d, aes(x, y)) + geom_point() + xlab(NULL) + ylab(NULL)
print(p)

上面图中x轴的文本0.006,这个数字中的6几乎看不到,因为一半过界了。

这种情况还可以更糟糕,比如我把字体搞大点:

p <- p + theme(axis.text=element_text(size=12))
print(p)

简直了,6都看不见了。第一次遇到这种情况,都会觉得这软件也太傻了!连坐标轴都会过界!但事实上,这是一个普遍的现象。因为像点这些,是数据空间,但文本是像素空间,只会按照指定的大小转化为多少个像素,然后把字打出来,这些当然容易打过界了。特别是如果把文本打在数据点的右边,比如我们画进化树时,需要画tip label,这纯粹是在右边打字的,文本通常只有部分显示出来,解决方案就在ggtree文档里,用xlim搞大右边。比如这个例子的话,+xlim很容易解决的:

p + xlim(NA, 0.0062)

当然复杂的情况也是有的,比如你在分面的时候,只有某个分面溢出了,而scales又是free的,你直接+xlim会应用于所有分面,但在free scale的情况下,你只想应用到某一分面,这个也是可以搞的,参考xlim_tree,做为思考题,看大家能不能悟出来。

讲ggtree各种技巧,对于你们学ggplot2也是极有帮助的!

G Yu, DK Smith, H Zhu, Y Guan, TTY Lam*. ggtree: an R package for visualization and annotation of phylogenetic trees with their covariates and other associated data. Methods in Ecology and Evolution. 2017, 8(1):28-36.