varias tamaño superponer modificar los lineas leyenda graficos grafico graficas ggplot escala ejes como cambiar barras r igraph

superponer - tamaño de la leyenda en r



¿Cómo controlar el diseño del gráfico igraph con posiciones fijas? (2)

Estoy tratando de dibujar una visualización de red para parecerse a un diagrama de flujo. Estoy bastante cerca con el siguiente código, pero tengo un par de preguntas:

  1. ¿Es este el mejor algoritmo de layout () o puedo asignar manualmente una posición para cada nodo>
  2. ¿Cómo puedo asegurarme de que estos nodos no se superpongan en la trama (como lo hacen aquí)?
  3. ¿Puedo asignar un nodo como "ancla" o punto de inicio? es decir, ¿puedo hacer que "C" sea el nodo más alto o más a la izquierda?

¡¡Muchas gracias!!

library("igraph") L3 <- LETTERS[1:8] d <- data.frame(start = sample(L3, 16, replace = T), end = sample(L3, 16, replace = T), weight = c(20,40,20,30,50,60,20,30,20,40,20,30,50,60,20,30)) g <- graph.data.frame(d, directed = T) V(g)$name E(g)$weight ideg <- degree(g, mode = "in", loops = F) col=rainbow(12) # For edge colors plot.igraph(g, vertex.label = V(g)$name, vertex.label.color = "gray20", vertex.size = ideg*25 + 40, vertex.size2 = 30, vertex.color = "gray90", vertex.frame.color = "gray20", vertex.shape = "rectangle", edge.arrow.size=0.5, edge.color=col, edge.width = E(g)$weight / 10, edge.curved = T, layout = layout.reingold.tilford)


El diseño en igraph se define en una matriz con 2 columnas y una fila para cada nodo. La primera columna indica su posición x y la segunda su posición y, y la escala no es relevante (siempre se vuelve a escalar para ajustarse a un área de trazado de -1 a 1. Puede obtener este diseño antes de dibujar simplemente llamando a la función de diseño en el gráfico :

l <-layout.reingold.tilford(g) l [,1] [,2] [1,] 0 0 [2,] -1 3 [3,] 0 1 [4,] 0 3 [5,] 0 2 [6,] 0 4 [7,] 1 3

De esta manera, puede cambiarlo de la forma que desee manualmente y luego enviarlo a la trama:

plot.igraph(g, vertex.label = V(g)$name, vertex.label.color = "gray20", vertex.size = ideg*25 + 40, vertex.size2 = 30, vertex.color = "gray90", vertex.frame.color = "gray20", vertex.shape = "rectangle", edge.arrow.size=0.5, edge.color=col, edge.width = E(g)$weight / 10, edge.curved = T, layout = l)

También parece que puede establecer los params argumento para controlar el diseño de apego. Esta es una lista que contiene un argumento root que aparentemente puede usarse para establecer la raíz del gráfico. Asígnele un número del nodo (recuerde que igraph usa índices tipo C para los nodos, el primero es 0). Así que estableciendo la raíz en "C":

l <- layout.reingold.tilford(g,params=list(root=2))

EDITAR: También el RGraphViz tiene algunos diseños de árboles agradables en los que vale la pena echarle un vistazo.

EDIT 2:

Este es un fragmento modificado de los códigos fuente de mi paquete, que utiliza un mismo tipo de matriz de diseño para definir la ubicación de los nodos en un gráfico, que podría encontrar útil:

gridLayout <- function(x) { LmatX <- seq(-1,1,length=ncol(x)) LmatY <- seq(1,-1,length=nrow(x)) loc <- t(sapply(1:max(x),function(y)which(x==y,arr.ind=T))) layout <- cbind(LmatX[loc[,2]],LmatY[loc[,1]]) return(layout) }

Lo que hace esta función es transformar una matriz que especifica el diseño en una cuadrícula (similar al layout() ) en un diseño de dos columnas con las posiciones x e y. Defina una matriz de ceros y para cada nodo entero desde 1 hasta el número total de nodos (este es el igraph ID + 1).

Por ejemplo, para un gráfico de 4 nodos tonto:

grid <- matrix(c( 0,0,1,0,0, 2,0,3,0,4),nrow=2,byrow=TRUE) library("igraph") g <- graph.adjacency(matrix(1,4,4)) plot(g,layout=gridLayout(L))


Un método menos complicado que el anterior si desea asignar las ubicaciones de los nodos usted mismo es agregar columnas etiquetadas xey en su hoja de datos con las coordenadas x e y para los nodos respectivos en esas columnas. p.ej

library(''igraph'') nodes <- c(''a'',''b'',''c'',''d'') x <- c(0,1,2,3) y <- c(0,1,2,3) from <- c(''a'',''b'',''c'') to <- c(''b'',''c'',''d'') NodeList <- data.frame(nodes, x ,y) EdgeList <- data.frame(from, to) a<- graph_from_data_frame(vertices = NodeList, d= EdgeList, directed = FALSE) plot(a)