将抖动点添加到 ggnetwork 图

Add jitterred points to a ggnetwork plot

我有 graph 个顶点和边,我想使用 fruchtermanreingold 布局绘制它们。

这是 graph 边矩阵:

edge.mat <- matrix(as.numeric(strsplit("3651,0,0,1,0,0,0,0,2,0,11,2,0,0,0,300,0,1,0,0,66,0,78,9,0,0,0,0,0,0,11690,0,1,0,0,0,0,0,0,0,0,493,1,1,0,4288,5,0,0,36,0,9,7,3,0,6,1,0,1,7,490,0,0,0,6,0,0,628,6,12,0,0,0,0,0,641,0,0,4,0,0,0,0,0,0,66,0,0,0,0,3165,0,281,0,0,0,0,0,0,0,0,45,1,0,0,35248,0,1698,2,0,1,0,2,99,0,0,6,29,286,0,31987,0,1,10,0,8,0,16,0,21,1,0,0,1718,0,51234,0,0,17,3,12,0,0,7,0,0,0,1,0,2,16736,0,0,0,3,0,0,4,630,0,0,0,9,0,0,29495,53,6,0,0,0,0,5,0,0,0,0,3,0,19,186,0,0,0,482,8,12,0,1,0,7,1,0,6,0,26338",
                              split = ",")[[1]]),
                   nrow = 14,
                   dimnames = list(LETTERS[1:14], LETTERS[1:14]))

然后我使用以下方法创建一个 igraph 对象:

gr <- igraph::graph_from_adjacency_matrix(edge.mat, mode="undirected", weighted=T, diag=F)

然后使用ggnetworkgr转换为data.frame,指定顶点颜色:

set.seed(1)
gr.df <- ggnetwork::ggnetwork(gr,
                              layout="fruchtermanreingold", 
                              weights="weight", 
                              niter=50000, 
                              arrow.gap=0)

然后我使用 ggplot2ggnetwork:

绘制它
vertex.colors <- strsplit("#00BE6B,#DC2D00,#F57962,#EE8044,#A6A400,#62B200,#FF6C91,#F77769,#EA8332,#DA8E00,#C59900,#00ACFC,#C49A00,#DC8D00",
                          split=",")[[1]]

library(ggplot2)
library(ggnetwork)

ggplot(gr.df, aes(x = x, y = y, xend = xend, yend = yend)) +
  geom_edges(color = "gray", aes(size = weight)) +
  geom_nodes(color = "black")+
  geom_nodelabel(aes(label = vertex.names),
                 color = vertex.colors, fontface = "bold")+
  theme_minimal() + 
  theme(axis.text=element_blank(), 
        axis.title=element_blank(),
        legend.position="none")

在我的例子中,每个顶点实际上代表许多点,其中每个顶点都有不同数量的点。将该信息添加到 gr.df:

gr.df$n <- NA
gr.df$n[which(is.na(gr.df$weight))] <- as.integer(runif(length(which(is.na(gr.df$weight))), 100, 500))

我想做的是在每个顶点周围添加 gr.df$n 个径​​向抖动点(即,与其对应的 n),使用相同的 vertex.colors 编码.知道怎么做吗?

我认为使用 geom_point 进行采样然后绘图是一个合理的策略。 (否则您可以创建自己的 geom)。

这是一些粗略的代码,从您问题的相关部分开始

gr.df$n <- 1
gr.df$n[which(is.na(gr.df$weight))] <- as.integer(runif(length(which(is.na(gr.df$weight))), 100, 500))

# function to sample
# 
circSamp <- function(x, y, R=0.1){
    n <- length(x)
    A <- a <- runif(n,0,1)
    b <- runif(n,0,1)

    ind <- b < a
    a[ind] <- b[ind]
    b[ind] <- A[ind]

    xn = x+b*R*cos(2*pi*a/b)
    yn = y+b*R*sin(2*pi*a/b)
    cbind(x=xn, y=yn)
 }


# sample  
d <- with(gr.df, data.frame(vertex.names=rep(vertex.names, n),
                            circSamp(rep(x,n), rep(y,n))))

# p is your plot   
p + geom_point(data=d, aes(x, y, color = vertex.names),
               alpha=0.1, inherit.aes = FALSE) +
    scale_color_manual(values = vertex.colors)

给予