You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言树形图可视化:如何在节点中展示顶点属性信息?

在R树形图中展示节点属性的解决方案

一、改进现有igraph代码(无需换包)

igraph本身支持自定义节点标签,只需将需要展示的属性拼接为字符串,即可在图中显示所有信息:

library(igraph)

df <- data.frame("node_name"=c("root", "root0", "root1", "root00", "root01", "root10", "root11"),
                 "parent"=c("root", "root", "root", "root0", "root0", "root1", "root1"),
                 "incident"=c(0, 0, 1, 0, 1, 0, 1),
                 "rating"=c(1, 0.97, 1.02, 0.95, 0.99, 0.99, 1.09))

g <- igraph::graph_from_data_frame(d=df[, c("node_name", "parent")],
  vertices=df[, c("node_name", "incident", "rating")])

# 拼接节点标签,用换行分隔不同属性
V(g)$label <- paste(V(g)$node_name, 
                    paste("incident:", V(g)$incident), 
                    paste("rating:", V(g)$rating), 
                    sep = "\n")

pdf("tree_with_attributes.pdf")
plot(g, layout=layout_as_tree(g, flip.y=FALSE), 
     vertex.label.cex=0.8,  # 调整标签字号
     vertex.label.dist=0)   # 让标签贴近节点
dev.off()

二、使用ggtree包(基于ggplot2,灵活度更高)

ggtree是专门针对树形可视化的工具,支持直接映射节点属性,适配ggplot2的图层语法:

library(ggtree)
library(tibble)

# 转换数据为树形结构格式,移除root的自环
edges <- df[-1, c("parent", "node_name")]
tree <- as.phylo.data.frame(edges, method = "user", node.label = df$node_name)

# 绑定节点属性到树形数据中
tree$data <- df %>% 
  select(node_name, incident, rating) %>% 
  rename(label = node_name)

# 绘制树形图,同时显示所有节点属性
ggtree(tree, layout = "rectangular") +
  geom_tiplab(aes(label = paste(label, "\nincident:", incident, "\nrating:", rating)), 
              size = 3.5) +
  geom_nodelab(aes(label = paste(label, "\nincident:", incident, "\nrating:", rating)), 
               size = 3.5) +
  theme_tree2()

三、使用DiagrammeR包(自定义程度高)

DiagrammeR通过类DOT语法定义图形,可精细控制节点内容和样式:

library(DiagrammeR)

# 构建图形语法字符串
graph_str <- "digraph tree {
  graph [rankdir = TB]  # 设置从上到下的布局
  node [shape = box]    # 节点使用矩形样式
"

# 逐个添加带属性的节点
for(i in 1:nrow(df)){
  node <- df[i,]
  graph_str <- paste0(graph_str, 
                      "  ", node$node_name, " [label = \"", 
                      node$node_name, "\\nincident: ", node$incident, 
                      "\\nrating: ", node$rating, "\"];\n")
}

# 添加节点间的连接(跳过root的自环)
for(i in 2:nrow(df)){
  node <- df[i,]
  graph_str <- paste0(graph_str, "  ", node$parent, " -> ", node$node_name, ";\n")
}

graph_str <- paste0(graph_str, "}")

# 渲染并显示图形
grViz(graph_str)

内容的提问来源于stack exchange,提问作者Helen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 09:15:20