使用ggplot将geom_label定位在网络外部?

电子

我正在使用ggnet创建网络样式图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中制作的):带有移动标签的示例

有可能做这样的事情吗?

艾伦卡梅伦

这是可能的,虽然不是特别容易或便携。该对象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

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章