我正在使用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] 删除。
我来说两句