2011-09-22 9 views
16

Necesito dibujar una red con 5 nodos y 20 bordes dirigidos (un borde conectando cada 2 nodos) usando R, pero necesito dos características para existir:Red de dibujo en R (grosor del borde de control más bordes no superpuestos)

  1. Para poder controlar el grosor de cada borde.
  2. Los bordes no se superponen (es decir, la forma del borde de A a B no se dibuja sobre el borde de B a A)

He pasado horas buscando una solución, y trataron muchos paquetes, pero siempre hay un problema

¿Alguien puede sugerir una solución, por favor, y dar un ejemplo completo como sea posible?

Muchas gracias de antemano.

Respuesta

23

Si está bien que las líneas sean curvas, entonces sé de dos maneras. Primero creo un edgelist:

Edges <- data.frame(
    from = rep(1:5,each=5), 
    to = rep(1:5,times=5), 
    thickness = abs(rnorm(25))) 

Edges <- subset(Edges,from!=to) 

Este contiene el nodo de origen en la primera columna, el nodo de destino en el segundo y el peso en el tercero. Puedes usar mi qgraph de pacake para trazar un gráfico ponderado usando esto. Por defecto, los bordes son curvos si hay múltiples aristas entre dos nodos:

library("qgraph") 
qgraph(Edges,esize=5,gray=TRUE) 

qgraph

Sin embargo, este paquete no está realmente diseñado para este propósito y no se puede cambiar los colores del borde (sin embargo, trabajando en eso:)). Sólo se pueden hacer todos los bordes negro con un pequeño truco:

qgraph(Edges,esize=5,gray=TRUE,minimum=0,cut=.Machine$double.xmin) 

Para un mayor control se puede utilizar el paquete de igraph. Primero hacemos el gráfico:

library("igraph") 
g <- graph.edgelist(as.matrix(Edges[,-3])) 

Tenga en cuenta la conversión a la matriz y restar uno porque el primer nodo es 0.A continuación definimos el diseño:

l <- layout.fruchterman.reingold(g) 

Ahora podemos cambiar algunos de los parámetros de borde con la función E():

# Define edge widths: 
E(g)$width <- Edges$thickness * 5 

# Define arrow widths: 
E(g)$arrow.width <- Edges$thickness * 5 

# Make edges curved: 
E(g)$curved <- 0.2 

Y finalmente trazar la gráfica:

plot(g,layout=l) 

igraph

+0

Muchas gracias, Las 2 soluciones están funcionando. Pero ahora encontré otro problema; Estoy dibujando 2 redes con los mismos nombres de nodo pero con diferente grosor de borde, el mismo nodo tiene una ubicación diferente en cada red, por ejemplo, el nodo 1 en la 1ra red se dibuja en la esquina superior izquierda y en la 2da red se dibuja en la parte superior derecho. Necesito que los nodos estén en la misma ubicación, por lo que es fácil compararlos visualmente entre las 2 redes. ¿Conoces una manera de arreglar esto? Gracias – Pansy

+0

Puede definir manualmente la ubicación de los nodos utilizando un diseño fijo. En qgraph esto se puede hacer de la siguiente manera: Almacene el diseño de un gráfico con: 'L <- qgraph ([arguments]) $ layout' luego utilícelo en otro gráfico con' qgraph ([arguments], layout = L) '. En igraph puedes guardar el layour como ya he mostrado anteriormente y solo usarlo nuevamente en el segundo gráfico. –

+0

No estoy seguro de por qué, pero el bit que tiene el código 'g <- graph.edgelist (as.matrix (Edges [, - 3] -1))' produce un error como 'Error in graph (t (el) , dirigido = dirigido): en structure_generators.c: 84: Id. de vértice (negativo) inválido, Id. de vértice no válido ¿Alguna idea de cuál es el problema? –

1

El paquete denominado informativamente 'red' puede dibujar redes dirigidas bastante bien y manejar sus problemas.

ex.net <- rbind(c(0, 1, 1, 1), c(1, 0, 0, 1), c(0, 0, 0, 1), c(1, 0, 1, 0)) 

plot(network(ex.net), usecurve = T, edge.curve = 0.00001, 
    edge.lwd = c(4, rep(1, 7))) 

El argumento edge.curve, si se pone muy bajo y se combina con usecurve = T, separa los bordes, aunque podría ser una manera más directa de hacer esto, y edge.lwd puede tomar un vector como su argumento para diferentes tamaños.

No siempre es el resultado más bonito, lo admito. Pero es bastante fácil obtener gráficos de red de aspecto decente que se pueden personalizar de varias maneras diferentes (ver? Network.plot).

1

La restricción 'no solapante' en los bordes es la gran problema aquí. En primer lugar, su red debe ser 'plana', de lo contrario es imposible en 2 dimensiones (no puede conectar tres casas a edificios de gas, eléctricos o de compañías telefónicas sin cruces).

Creo que un algoritmo para el diseño de gráficos planos resuelve esencialmente el problema de los 4 colores. Divertirse con eso. Heurística existe, búsqueda de diseño de gráfico plano, y dirigida a la fuerza, y leer Planar Graph Layouts

+0

OP significaba que los bordes entre dos nodos no se superponían, no todos los bordes. –

+0

Ah sí. Solo dibujaría un borde y pegaría puntas de flecha en el extremo o extremos apropiados. Trabajo hecho :) – Spacedman

Cuestiones relacionadas