ggtree–绘图2

ggtree
Author

大番薯本薯

Published

January 15, 2026

Modified

January 15, 2026

本节针对“线”与“面”元素进行介绍,让我们先加载一个基本的树。

suppressMessages(library(tidyverse))
suppressMessages(library(treeio))
suppressMessages(library(ggtree))

nwk <- system.file("extdata", "sample.nwk", package = "treeio")
tree <- treeio::read.tree(nwk)
tree$node.label <- c("root", paste("node", 2:treeio::Nnode(tree)))
p <- ggtree(tree)

线元素

我们称tip(taxa)之间的关系为“线”。可以使用geom_taxalink()进行绘制:

dat <- data.frame(
  from = c("A", "F", "L"),
  to = c("E", "K", "M"),
  h = c(1, 1, 0.1),
  type = c("t1", "t2", "t3")
)
p + geom_tiplab() +
  geom_taxalink(
    data = dat,
    mapping = aes(
      taxa1 = from,
      taxa2 = to,
      color = type
    ),
    curvature = -0.2
  )

面元素

“面”元素指的是树图中的一部分或全部,即某个分支clade和整棵树的布局layout

clade

树的分支–clade–由nodetip组成。与clade相关的函数,可以分为两大类:

  • 在图中进行标记或美学映射来注释clade信息。
  • 对特定的clade进行删减,压缩,旋转等,实现修改树的layout

注释信息类

tree_g <- groupClade(tree, .node = c("node 4", "node 8"), group_name = "clade")
tree_g <- groupOTU(tree_g, .node = LETTERS[1:5], group_name = "otu")
ggtree(tree_g, aes(color = clade)) + geom_nodelab()

ggtree(tree_g, aes(color = otu)) + geom_tiplab()


p1 <- p +
  geom_cladelab(
    node = 17,
    label = "clade 4",
    align = TRUE, offset = 1, offset.text = 0.5
  ) +
  scale_x_continuous(expand = c(0.2, 0))

p2<-p + geom_strip(
  "D", "J",
  label = "otu 1",
  align = TRUE, offset = 1, offset.text = 0.5
) +
  scale_x_continuous(expand = c(0.2, 0))

p3 <- p + geom_hilight(node = 17, fill = "red", to.bottom = TRUE)
p4 <- p + geom_balance(node = 17)
plot_list(p1, p2, p3, p4, tag_levels = "A", ncol = 2)

修改布局类

  • viewClade():只显示特定的clade
  • scaleClade():对特定的clade进行纵向缩放。
  • collapse():对特定的clade进行折叠,有max,min,mixed三种显示折叠的样式。
  • expand():对特定的clade进行展开。
  • rotate():对特定的clade进行旋转。

这些函数都是在ggplot对象上进行操作,不会对数据进行增删

p1 <- ggtree(tree) + geom_tiplab()
p2 <- viewClade(p1, MRCA(p, "I", "L"))

p3 <- ggtree(tree_g, aes(color = clade)) +
  geom_tiplab() +
  scale_color_manual(values = c("black", "firebrick", "steelblue")) +
  theme(legend.position = "none")
p4 <- scaleClade(p3, node = 17, scale = .1)

p5 <- p1 %>% collapse(node = 21) +
  geom_point2(aes(subset = (node == 21)), shape = 21, size = 5, fill = "green")
p5 <- collapse(p5, node = 23) +
  geom_point2(aes(subset = (node == 23)), shape = 23, size = 5, fill = "red")

p6 <- expand(p5, node = 21)

p7 <- p3 +
  geom_tiplab() +
  geom_point2(aes(subset = node == 16), color = "darkgreen", size = 5)
p8 <- rotate(p7, node = 21)
plot_list(p1, p2, p3, p4, p5,p6,p7,p8, tag_levels = "A", ncol = 2)

scaleClade()collapse()搭配使用,调整树的布局:

## 三种折叠样式
collapse(p2, 21, "max") %>% expand(21)
collapse(p2, 21, "min") %>% expand(21)
collapse(p2, 21, "mixed") %>% expand(21)
## 设置块的样式
collapse(p2, 21, "mixed", fill = "steelblue", alpha = .4) %>%
  collapse(23, "mixed", fill = "firebrick", color = "blue")
## 搭配使用
scaleClade(p, 23, .2) %>% collapse(23, "min", fill = "darkgreen")

max

min

mixed

set style

with scaleClade()

layout

树的布局layout通常在geom_tree()ggtree()中设置,layout参数的有效设置有:“rectangular”, “roundrect”, “slanted”, “ellipse”, “dendrogram”, “circular”, “fan”, “inward_circular”, “daylight”, “equal_angle”, “radial”, “ape” 等布局。

布局类型

树的布局可以分为五类:

  • Phylogram:“rectangular”, “roundrect”, “slanted”, “ellipse”, “dendrogram”, “circular”, “fan”, “inward_circular”。
  • Unrooted layout:“daylight”, “equal_angle”, “radial”, “ape”。
  • Cladogram:不考虑枝长的树,设置branch.length = "none"即可。
  • Timescaled layout:设置mrsd参数且添加theme_tree2()主题,ggtree会添加一根时间轴。
  • Two-dimensional tree layout:设置yscale参数,会添加一根参数所在范围的y轴,需要使用能显示轴的主题,例如theme_classic(),当使用categorical数据时,请设置yscale_mapping参数。
## Phylogram:
ggtree(tree) # 默认 rectangular
ggtree(tree, layout = "roundrect")
ggtree(tree, layout = "slanted")
ggtree(tree, layout = "ellipse")
ggtree(tree, layout = "dendrogram")
ggtree(tree, layout = "circular")
ggtree(tree, layout = "fan", open.angle = 120)
ggtree(tree, layout = "inward_circular")
## Unrooted layout:
ggtree(tree, layout = "daylight")
ggtree(tree, layout = "equal_angle")
ggtree(tree, layout = "radial")
ggtree(tree, layout = "ape")
## Cladogram:
ggtree(tree, branch.length = "none")
## Timescaled layout:
ggtree(tree, mrsd = "2010-01-01") + theme_tree2() # 此处仅展示,没有实际含义
## Two-dimensional tree layout:
ggtree(tree, yscale = "branch.length") + theme_classic() +
  geom_nodepoint(size = 2, color = "red") +
  geom_tippoint(size = 2, color = "blue")

rectangular

roundrect

slanted

ellipse

dendrogram

circular

fan

inward_circular

daylight

equal_angle

radial

ape

Cladogram

Timescaled

Two-dimensional

树布局变换

ggplot或ggtree系提供了一下调整树布局的函数,大致可以分为两类:

对于极坐标系的布局,可以使用scale_x_continuous()中的limitsexpand参数调整空白圆圈的半径。

## 翻转
ggtree(tree) + scale_x_reverse()
ggtree(tree) + scale_y_reverse()
ggtree(tree) + coord_flip()
## 旋转
ggplotify::as.ggplot(ggtree(tree), angle = -30, scale = .9)
rotate_tree(ggtree(tree, layout = "circular"), 180)
## 布局变换
ggtree(tree, layout = "slanted") + layout_circular()
ggtree(tree) + layout_dendrogram()
ggtree(tree) + layout_fan(angle = 60)
open_tree(p, 180)
ggtree(tree) + layout_inward_circular(xlim = 100)
ggtree(tree, layout = "circular") + layout_rectangular()
## 调整空白圆圈
ggtree(tree, layout = "circular") +
  scale_x_continuous(expand = c(1, 0))

scale_x_reverse()

scale_y_reverse()

coord_flip()

ggplotify::as.ggplot()

rotate_tree()

layout_circular()

layout_dendrogram()

layout_fan()

open_tree()

layout_inward_circular()

layout_rectangular()

scale_x_continuous()
Back to top