1

我正在使用ggnetand创建一个网络样式图ggplot。目前我只是使用geom_label'snudge_y参数来定位标签。但我想知道是否可以定位标签,使它们始终位于圆圈的外部(我的网络始终是圆形的)。下面显示了一个玩具示例。

library(ggplot2)
library(igraph)
library(GGally) # contains ggnet2

nam <- c("A", "B", "C", "D", "E") # Node name

g <- sample_pa(5, m = 5)  # generate graph with x nodes
g <- igraph::as_data_frame(g) # create df
g <- rbind(g$to,g$from) # create matrix


net.bg <- make_graph(g, 5, directed = FALSE) #make graph
E(net.bg)$weight <- sample(1:3, 5,replace=T)
V(net.bg)$size   <- sample(1:5, 5,replace=T)


p <- ggnet2(net.bg, 
            mode = "circle",  
            size = V(net.bg)$size,
            node.color = "red",
            edge.size = E(net.bg)$weight,
            edge.alpha = 0.5,
            edge.color = "blue") +
  theme(legend.text = element_text(size = 10)) +
  geom_label(aes(label = nam),nudge_y = 0.05)

p

上面的代码产生如下内容: 示例网络

可以看出,标签都在 y 方向上轻推。但我希望制作这样的东西(我在 powerpoint 中制作的): 带有移动标签的示例

有可能做这样的事情吗?

4

1 回答 1

1

这是可能的,尽管不是特别容易或便携。该对象p是一个 ggplot 对象,因此包含了在坐标、几何、映射、数据等方面构建绘图所需的所有信息。

这意味着您可以直接更改labels图层,使其 x、y 坐标是其先前值的小倍数。所以你可以这样做:

geoms <- sapply(p$layers, function(x) class(x$geom)[1])
segments <-  p$layers[[which(geoms == "GeomSegment")]] 
labels <-  p$layers[[which(geoms == "GeomLabel")]] 
segments$data <- segments$data - 0.5
p$data$x <- p$data$x - 0.5
p$data$y <- p$data$y - 0.5
labels$position$y <- 0
labels$data <- p$data
labels$data$x <- labels$data$x * 1.1
labels$data$y <- labels$data$y * 1.1
p$scales$scales <- lapply(p$scales$scales, function(x) {
  if(class(x)[1] == "ScaleContinuousPosition") ScaleContinuousPosition else x })
p <- p + theme(axis.text = element_blank())

p

在此处输入图像描述

于 2020-10-28T20:21:14.517 回答