Добавьте дрожащие точки на график ggnetwork - PullRequest
0 голосов
/ 03 октября 2018

У меня есть 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)

И затем использую ggnetwork для преобразования gr в data.frame с указанными цветами вершин:

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

И затем я строю график, используя ggplot2 и ggnetwork:

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")

enter image description here

В моем случае каждая вершина фактически представляет много точек,где каждая вершина имеет различное количество точек.Добавление этой информации к 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 кодировка.Есть идеи, как это сделать?

1 Ответ

0 голосов
/ 07 октября 2018

Я думаю, что выборка, а затем построение графиков с 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
# /5709255/sozdat-sluchainuy-tochku-vnutri-kruga-ravnomerno
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)

Давать

enter image description here

...