superponer - ¿Cómo visualizar una gran red en R?
superponer graficas en r (4)
Las visualizaciones de red se vuelven comunes en la ciencia en la práctica. Pero a medida que las redes aumentan de tamaño, las visualizaciones comunes se vuelven menos útiles. Simplemente hay demasiados nodos / vértices y enlaces / bordes. A menudo, los esfuerzos de visualización terminan produciendo "bolas de pelo".
Se han propuesto algunos enfoques nuevos para superar este problema, por ejemplo:
- Edge bundling:
- Agrupamiento jerárquico de los bordes:
- Diseño de atributos del grupo:
Estoy seguro de que hay muchos más enfoques. Por lo tanto, mi pregunta es: ¿cómo superar el problema de la bola de pelo, es decir, cómo visualizar grandes redes mediante el uso de R?
Aquí hay un código que simula una red ejemplar:
# Load packages
lapply(c("devtools", "sna", "intergraph", "igraph", "network"), install.packages)
library(devtools)
devtools::install_github(repo="ggally", username="ggobi")
lapply(c("sna", "intergraph", "GGally", "igraph", "network"),
require, character.only=T)
# Set up data
set.seed(123)
g <- barabasi.game(1000)
# Plot data
g.plot <- ggnet(g, mode = "fruchtermanreingold")
g.plot
¿Esta pregunta está relacionada con la visualización del gráfico no dirigido que es demasiado grande para GraphViz? . Sin embargo, aquí estoy buscando no recomendaciones generales de software sino ejemplos concretos (utilizando los datos proporcionados anteriormente) qué técnicas ayudan a hacer una buena visualización de una red grande mediante el uso de R (comparable a los ejemplos en este hilo: R: Scatterplot con demasiados puntos ).
Esa es una pregunta interesante, no sabía la mayoría de las herramientas que enumeró, así que gracias. Puede agregar HivePlot a la lista. Es un método determinista que consiste en proyectar nodos en un número fijo de ejes (generalmente 2 o 3). Mira una página enlazada, hay muchos ejemplos visuales.
Funciona mejor si tiene un atributo nodal categórico en su conjunto de datos, por lo que puede usarlo para seleccionar a qué eje va un nodo. Por ejemplo, cuando se estudia la red social de una universidad: estudiantes en un eje, maestros en otro y personal administrativo en el tercero. Pero, por supuesto, también puede funcionar con un atributo numérico discreto (por ejemplo, personas jóvenes, de mediana edad y mayores en sus respectivos ejes).
Entonces necesitas otro atributo, y tiene que ser numérico (o al menos ordinal) esta vez. Se usa para determinar la posición de un nodo en su eje. También puede usar alguna medida topológica, como el grado o la transitividad (coeficiente de agrupación).
Cómo construir un hiveplot http://www.hiveplot.net/img/hiveplot-undirected-01.png
El hecho de que el método sea determinista es interesante, ya que permite comparar diferentes redes que representan sistemas distintos (pero comparables). Por ejemplo, puede comparar dos universidades (siempre que use los mismos atributos / medidas para determinar los ejes y la posición). También permite describir la misma red de varias maneras, eligiendo diferentes combinaciones de atributos / medidas para generar la visualización. Esta es la forma recomendada de visualizar una red, en realidad, gracias a un llamado panel de colmena.
Varios softwares capaces de generar esos gráficos de colmenas se enumeran en la página que mencioné al comienzo de esta publicación, incluidas las implementaciones en Java y R.
He estado lidiando con este problema recientemente. Como resultado, he encontrado otra solución. Contraiga el gráfico por comunidades / clusters. Este enfoque es similar a la tercera opción descrita por el OP arriba. Como advertencia, este enfoque funcionará mejor con gráficos no dirigidos. Por ejemplo:
library(igraph)
set.seed(123)
g <- barabasi.game(1000) %>%
as.undirected()
#Choose your favorite algorithm to find communities. The algorithm below is great for large networks but only works with undirected graphs
c_g <- fastgreedy.community(g)
#Collapse the graph by communities. This insight is due to this post http://.com/questions/35000554/collapsing-graph-by-clusters-in-igraph/35000823#35000823
res_g <- simplify(contract(g, membership(c_g)))
El resultado de este proceso es la figura a continuación, donde los nombres de los vértices representan membresía de la comunidad.
plot(g, margin = -.5)
Lo anterior es claramente más agradable que este lío horrible
plot(r_g, margin = -.5)
Para unir comunidades a vértices originales, necesitarás algo similar a lo siguiente
mem <- data.frame(vertices = 1:vcount(g), memeber = as.numeric(membership(c_g)))
IMO este es un buen enfoque por dos razones. En primer lugar, en teoría puede tratar con cualquier gráfico de tamaño. El proceso de búsqueda de comunidades puede repetirse continuamente en gráficos contraídos. Segundo, adoptar un enfoque interactivo arrojaría resultados muy legibles. Por ejemplo, uno puede imaginarse que el usuario puede hacer clic en un vértice en el gráfico contraído para expandir esa comunidad y revelar todos sus vértices originales.
Otra forma de visualizar redes muy grandes es con BioFabric (www.BioFabric.org), que utiliza líneas horizontales en lugar de puntos para representar los nodos. Los bordes se muestran usando segmentos de líneas verticales. Se muestra una demostración rápida de D3 de esta técnica en: http://www.biofabric.org/gallery/pages/SuperQuickBioFabric.html .
BioFabric es una aplicación Java, pero una simple versión R está disponible en: https://github.com/wjrl/RBioFabric .
Aquí hay un fragmento de código R:
# You need ''devtools'':
install.packages("devtools")
library(devtools)
# you need igraph:
install.packages("igraph")
library(igraph)
# install and load ''RBioFabric'' from GitHub
install_github(''RBioFabric'', username=''wjrl'')
library(RBioFabric)
#
# This is the example provided in the question:
#
set.seed(123)
bfGraph = barabasi.game(1000)
# This example has 1000 nodes, just like the provided example, but it
# adds 6 edges in each step, making for an interesting shape; play
# around with different values.
# bfGraph = barabasi.game(1000, m=6, directed=FALSE)
# Plot it up! For best results, make the PDF in the same
# aspect ratio as the network, though a little extra height
# covers the top labels. Given the size of the network,
# a PDF width of 100 gives us good resolution.
height <- vcount(bfGraph)
width <- ecount(bfGraph)
aspect <- height / width;
plotWidth <- 100.0
plotHeight <- plotWidth * (aspect * 1.2)
pdf("myBioFabricOutput.pdf", width=plotWidth, height=plotHeight)
bioFabric(bfGraph)
dev.off()
Aquí hay una foto de la versión BioFabric de los datos proporcionados por el interrogador, aunque las redes creadas con valores de m> 1 son más interesantes. El detalle del recuadro muestra un primer plano de la esquina superior izquierda de la red; el nodo BF4 es el nodo de mayor grado en la red, y el diseño predeterminado es una búsqueda de la red en amplitud (ignorando las direcciones de los bordes) comenzando desde ese nodo, con nodos vecinos atravesados en orden de grado de nodo decreciente. Tenga en cuenta que podemos ver inmediatamente que, por ejemplo, aproximadamente el 60% de los vecinos del nodo BF4 tienen un grado 1. También podemos ver desde el estricto borde inferior de 45 grados que esta red de 1000 nodos tiene 999 bordes, y por lo tanto es un árbol.
Divulgación completa: BioFabric es una herramienta que escribí.
Otro paquete más interesante es networkD3 . Hay una gran cantidad de medios para representar gráficos dentro de esta biblioteca. En particular, considero que forceNetwork
una opción interesante. Es interactivo y, por lo tanto, le permite explorar realmente su red. Es genial para EDA, pero tal vez demasiado "ondulante" para el trabajo final.