在 ggraph/ggplot2 中将几何标签放置在圆形布局之外
Placing geom labels outside of circular layout in ggraph/ggplot2
我正在尝试生成一个带有标记节点的圆形布局的交互网络图。我拼凑了一个功能脚本,显示了我想要的与 ggraph 的连接,但我无法弄清楚如何相对于圆形排列中的位置定位节点标签,因此它们不会与连接线重叠地点。有人针对使用 igraph (Placing vertex.label outside a circular layout in igraph) 时的相同问题发布了一个非常好的解决方案;但我认为这不适用于 ggraph,因为节点位置的计算方式似乎有所不同。我更愿意为此使用 ggraph,因为它有一个内置的图例功能,可以让我的生活更轻松。这是我目前所拥有的:
library(igraph)
library(tidyverse)
library(ggraph)
# Create example matrix
id <- c("s01", "s02", "s03", "s04", "s05")
s01 <- c(0, 0, 0, 1, 1)
s02 <- c(0, 0, 1, 1, 1)
s03 <- c(1, 0, 0, 0, 1)
s04 <- c(0, 1, 0, 0, 0)
s05 <- c(0, 0, 0, 0, 0)
links <- data.frame(id, s01, s02, s03, s04, s05)
links <- column_to_rownames(links, var = "id")
links <- as.matrix(links)
expertise <- c("neuro", "micro", "phys", "phys", "neuro")
nodes <- data.frame(id, expertise)
# Generate igraph object
network <- graph_from_adjacency_matrix(links, weighted = NULL, mode = "undirected")
# Generate plot
ggraph(network, layout = "circle") + geom_edge_arc(color = "darkgray", strength = 0.15) +
geom_node_point(size = 8, aes(color = nodes$expertise)) + geom_node_text(aes(label = id), nudge_y = -0.2) +
theme_void()
这会生成以下图:
问题是像 s02 这样的标签在网络内部,这成为密集图的问题。
有没有办法把所有标签都放在节点圈外?任何帮助将不胜感激!
这并不完全令人满意,因为它需要将绘图作为中间步骤分配,因为 geom nudge
参数不采用函数,但您可以相对于节点 xy 坐标向外移动标签:
library(igraph)
library(ggplot2)
library(ggraph)
# Generate igraph object
network <- graph_from_adjacency_matrix(links, weighted = NULL, mode = "undirected")
# Generate plot
p <- ggraph(network, layout = "circle") +
geom_edge_arc(color = "darkgray", strength = 0.15) +
geom_node_point(size = 8, aes(color = nodes$expertise)) +
theme_void()
p +
geom_node_text(aes(label = id), nudge_x = p$data$x * .1, nudge_y = p$data$y * .1)
我正在尝试生成一个带有标记节点的圆形布局的交互网络图。我拼凑了一个功能脚本,显示了我想要的与 ggraph 的连接,但我无法弄清楚如何相对于圆形排列中的位置定位节点标签,因此它们不会与连接线重叠地点。有人针对使用 igraph (Placing vertex.label outside a circular layout in igraph) 时的相同问题发布了一个非常好的解决方案;但我认为这不适用于 ggraph,因为节点位置的计算方式似乎有所不同。我更愿意为此使用 ggraph,因为它有一个内置的图例功能,可以让我的生活更轻松。这是我目前所拥有的:
library(igraph)
library(tidyverse)
library(ggraph)
# Create example matrix
id <- c("s01", "s02", "s03", "s04", "s05")
s01 <- c(0, 0, 0, 1, 1)
s02 <- c(0, 0, 1, 1, 1)
s03 <- c(1, 0, 0, 0, 1)
s04 <- c(0, 1, 0, 0, 0)
s05 <- c(0, 0, 0, 0, 0)
links <- data.frame(id, s01, s02, s03, s04, s05)
links <- column_to_rownames(links, var = "id")
links <- as.matrix(links)
expertise <- c("neuro", "micro", "phys", "phys", "neuro")
nodes <- data.frame(id, expertise)
# Generate igraph object
network <- graph_from_adjacency_matrix(links, weighted = NULL, mode = "undirected")
# Generate plot
ggraph(network, layout = "circle") + geom_edge_arc(color = "darkgray", strength = 0.15) +
geom_node_point(size = 8, aes(color = nodes$expertise)) + geom_node_text(aes(label = id), nudge_y = -0.2) +
theme_void()
这会生成以下图:
问题是像 s02 这样的标签在网络内部,这成为密集图的问题。
有没有办法把所有标签都放在节点圈外?任何帮助将不胜感激!
这并不完全令人满意,因为它需要将绘图作为中间步骤分配,因为 geom nudge
参数不采用函数,但您可以相对于节点 xy 坐标向外移动标签:
library(igraph)
library(ggplot2)
library(ggraph)
# Generate igraph object
network <- graph_from_adjacency_matrix(links, weighted = NULL, mode = "undirected")
# Generate plot
p <- ggraph(network, layout = "circle") +
geom_edge_arc(color = "darkgray", strength = 0.15) +
geom_node_point(size = 8, aes(color = nodes$expertise)) +
theme_void()
p +
geom_node_text(aes(label = id), nudge_x = p$data$x * .1, nudge_y = p$data$y * .1)