如何在R中不使用ggtree绘制指定合并结构的树形关系图
方案1:使用igraph包自定义布局实现
你描述的是典型的级联汇聚二叉树,结构规律非常明确,用igraph完全可以实现,只需要手动指定节点坐标即可,不需要依赖ggtree。
实现步骤:
- 首先构造边数据,计算每个节点所属的层级
- 按照层级给每个节点分配x、y坐标,保证同层级的两个节点横向均匀分布,不同层级纵向对齐
- 调用igraph的plot函数,关闭默认布局,使用自定义坐标绘制
代码示例:
# 加载igraph包 library(igraph) # 示例数据,可替换为你自己的in-out数据 edge_df <- data.frame( in = c(1,2,3,4,5,6), out = c(3,3,5,5,7,7) ) colnames(edge_df) <- c("from", "to") # 适配igraph的边命名规则 # 构造图对象 g <- graph_from_data_frame(edge_df, directed = TRUE) # 手动指定节点坐标(根据你的结构规律可自动生成,这里以3层结构为例) # y坐标越大代表层级越靠上,x坐标控制横向位置 coords <- matrix( c(1,4, # 节点1、2的坐标(x,y) 2,4, 1.5,3, # 节点3、4的坐标 2.5,3, 2,2, # 节点5、6的坐标 3,2, 2.5,1), # 节点7的坐标 ncol = 2, byrow = TRUE ) # 给坐标行命名对应节点ID rownames(coords) <- V(g)$name # 绘图 plot(g, layout = coords, vertex.size = 20, # 节点大小 vertex.color = "white", # 节点填充色 vertex.label.color = "black", # 节点文字颜色 edge.arrow.size = 0.5, # 箭头大小 edge.color = "black")
如果需要自动生成坐标,可根据你的结构规律编写逻辑:层级为k的层如果不是最后一层,就有2个节点,x坐标分别为k+0.5和k+1.5,y坐标为总层数 - k +1即可。
方案2:纯base R绘制(无需安装任何额外包)
如果连igraph也安装不了,可以直接用base R的segments函数画边,text函数标节点,完全自定义实现:
代码示例:
# 新建空白画布 plot(0, 0, type = "n", xlim = c(0.5, 3.5), ylim = c(0.5, 4.5), xlab = "", ylab = "", axes = FALSE) # 画各级节点和边 # level 1节点 text(1,4, "1", cex = 1.5) text(2,4, "2", cex = 1.5) # level1到level2的边 segments(1,4, 1.5, 3.5) segments(2,4, 1.5, 3.5) # level2节点 text(1.5,3, "3", cex = 1.5) text(2.5,3, "4", cex = 1.5) # level2到level3的边 segments(1.5,3, 2, 2.5) segments(2.5,3, 2, 2.5) # level3节点 text(2,2, "5", cex = 1.5) text(3,2, "6", cex = 1.5) # level3到level4的边 segments(2,2, 2.5, 1.5) segments(3,2, 2.5, 1.5) # 最后一层节点 text(2.5,1, "7", cex = 1.5)
如果需要横向绘制,只需要把x和y坐标互换即可,上下倒置则把y坐标全部取反或者调整ylim的大小顺序即可。
内容的提问来源于stack exchange,提问作者Joe King
相关产品推荐
相关产品推荐

