📜  用 R 和 ggraph 介绍树形图(1)

📅  最后修改于: 2023-12-03 15:40:52.444000             🧑  作者: Mango

用 R 和 ggraph 介绍树形图

树形图是一种展示层级结构的图形,能够清晰地展示父节点与子节点之间的关系。在数据可视化中被广泛使用。本文将介绍如何使用 R 和 ggraph 来创建树形图。

安装 ggraph

要使用 ggraph,我们首先需安装它。可以使用以下命令从 CRAN 安装最新版本:

install.packages("ggraph")

或者利用 devtools 安装最新的开发版本:

devtools::install_github("thomasp85/ggraph")
创建数据

为了说明如何创建树形图,我们将使用一个家族关系示例数据集来展示父母和子女之间的关系。

首先,我们创建包含每个家庭成员信息的数据框架,其中每行代表一个人,包含其名称和父母的名称:

family_data <- data.frame(
  Name = c("Grandfather1", "Grandmother1", "Grandfather2", "Grandmother2",
           "Father", "Mother", "Sister", "Brother", "Child1", "Child2"),
  Parent = c(NA, NA, NA, NA, "Grandfather1", "Grandmother1", "Father", "Father", "Father", "Father")
)

我们将使用 ggraph 包来将数据转换为可视化,因此需要将数据转换成一个 igraph 对象。我们可以使用 igraph 包的 graph_from_data_frame() 函数轻松地将数据框转化为 igraph 对象。

library(igraph)
family <- graph_from_data_frame(family_data, directed = TRUE)

现在,我们有了一个包含节点和边缘的图谱对象,可以使用 plot() 函数来查看图谱。

plot(family)

image-20210902171151873

绘制树形图

使用 ggraph 包可以轻松地绘制树形图。下面的代码使用 ggraphigraph 包来绘制家谱树形图。

library(ggraph)
ggraph(family, layout = 'dendrogram', circular = TRUE) + 
  geom_edge_link() +
  geom_node_point() +
  geom_node_text(aes(label = name), size = 4, vjust = -1) +
  theme_void()

解释:

  • ggraph(family, layout = 'dendrogram', circular = TRUE):定义一个空白的画布并使用 dendrogram 布局(树状结构),circular = TRUE 表示绘制一个圆形图表。
  • geom_edge_link():绘制连接父母和子女节点之间的路径。
  • geom_node_point():绘制节点。
  • geom_node_text(aes(label = name), size = 4, vjust = -1):为节点添加标签。
  • theme_void():删除默认的主题和背景。

最终输出的图表如下所示:

image-20210902171244405

完整代码

library(igraph)
library(ggraph)

# 创建数据
family_data <- data.frame(
  Name = c("Grandfather1", "Grandmother1", "Grandfather2", "Grandmother2",
           "Father", "Mother", "Sister", "Brother", "Child1", "Child2"),
  Parent = c(NA, NA, NA, NA, "Grandfather1", "Grandmother1", "Father", "Father", "Father", "Father")
)

# 创建图谱对象
family <- graph_from_data_frame(family_data, directed = TRUE)

# 绘制树形图
ggraph(family, layout = 'dendrogram', circular = TRUE) + 
  geom_edge_link() +
  geom_node_point() +
  geom_node_text(aes(label = name), size = 4, vjust = -1) +
  theme_void()