webentwicklung-frage-antwort-db.com.de

Wie visualisiere ich ein großes Netzwerk in R?

Netzwerkvisualisierungen sind in der Praxis in der Wissenschaft weit verbreitet. Mit zunehmender Größe von Netzwerken werden häufig verwendete Visualisierungen jedoch weniger nützlich. Es gibt einfach zu viele Knoten/Eckpunkte und Verknüpfungen/Kanten. Oft führen Visualisierungsbemühungen zu "Haarbällen".

Einige neue Ansätze wurden vorgeschlagen, um dieses Problem zu überwinden, z.

Ich bin sicher, dass es noch viele weitere Ansätze gibt. Daher lautet meine Frage: Wie kann man das Problem des Hairballs lösen, d. H. Wie kann man große Netzwerke mithilfe von R visualisieren?

Hier ist ein Code, der ein beispielhaftes Netzwerk simuliert:

# 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

enter image description here

Diese Frage bezieht sich auf Visualisieren eines ungerichteten Diagramms, das für GraphViz zu groß ist? . Ich suche hier jedoch nicht nach allgemeinen Software-Empfehlungen, sondern nach konkreten Beispielen (unter Verwendung der oben angegebenen Daten), welche Techniken dazu beitragen, ein großes Netzwerk mit R (vergleichbar mit den Beispielen in diesem Thread: R: Streudiagramm mit zu vielen Punkten ).

54
majom

Eine andere Möglichkeit, sehr große Netzwerke darzustellen, ist BioFabric (www.BioFabric.org), bei dem anstelle von Punkten horizontale Linien zur Darstellung der Knoten verwendet werden. Kanten werden dann mit vertikalen Liniensegmenten angezeigt. Eine kurze D3-Demo dieser Technik finden Sie unter: http://www.biofabric.org/gallery/pages/SuperQuickBioFabric.html .

BioFabric ist eine Java) - Anwendung, aber eine einfache R-Version ist verfügbar unter: https://github.com/wjrl/RBioFabric .

Hier ist ein Ausschnitt aus dem R-Code:

 # 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()

Hier ist eine Aufnahme der BioFabric-Version der vom Fragesteller bereitgestellten Daten, obwohl Netzwerke, die mit Werten von m> 1 erstellt wurden, interessanter sind. Das Detail des Einschubs zeigt eine Nahaufnahme der oberen linken Ecke des Netzwerks. Knoten BF4 ist der Knoten mit dem höchsten Grad im Netzwerk, und das Standardlayout ist eine Breitensuche des Netzwerks (ohne Berücksichtigung der Kantenrichtungen) ab diesem Knoten, wobei benachbarte Knoten in der Reihenfolge abnehmenden Knotengrades durchlaufen werden. Man beachte, dass wir sofort sehen können, dass beispielsweise etwa 60% der Nachbarn des Knotens BF4 Grad 1 sind. Wir können auch an der strengen unteren Kante von 45 Grad erkennen, dass dieses 1000-Knoten-Netzwerk 999 Kanten hat und daher ein Baum ist.

BioFabric presentation of example data

Vollständige Offenlegung: BioFabric ist ein Tool, das ich geschrieben habe.

16
wjrl

Das ist eine interessante Frage, ich kannte die meisten Tools nicht, also danke. Sie können der Liste HivePlot hinzufügen. Es ist eine deterministische Methode, bei der Knoten auf eine feste Anzahl von Achsen projiziert werden (normalerweise 2 oder 3). Schauen Sie sich die verlinkte Seite an, es gibt viele visuelle Beispiele.

enter image description here

Es funktioniert besser, wenn Sie ein kategoriales Knotenattribut in Ihrem Dataset haben, sodass Sie damit auswählen können, zu welcher Achse ein Knoten führt. Zum Beispiel beim Studium des sozialen Netzwerks einer Universität: Studenten auf einer Achse, Lehrer auf einer anderen und Verwaltungsmitarbeiter auf der dritten. Es kann aber natürlich auch mit einem diskretisierten numerischen Attribut arbeiten (z. B. junge, mittlere und ältere Menschen auf ihren jeweiligen Achsen).

Dann brauchen Sie ein anderes Attribut, und dieses Mal muss es numerisch (oder zumindest ordinal) sein. Es wird verwendet, um die Position eines Knotens auf seiner Achse zu bestimmen. Sie können auch ein topologisches Maß wie Grad oder Transitivität (Clustering-Koeffizient) verwenden.

Wie man ein Hiveplot erstellt http://www.hiveplot.net/img/hiveplot-undirected-01.png

Die Tatsache, dass die Methode deterministisch ist, ist interessant, da sie den Vergleich verschiedener Netzwerke ermöglicht, die unterschiedliche (aber vergleichbare) Systeme darstellen. Sie können beispielsweise zwei Universitäten vergleichen (vorausgesetzt, Sie verwenden dieselben Attribute/Kennzahlen, um Achsen und Positionen zu bestimmen). Sie können dasselbe Netzwerk auch auf verschiedene Arten beschreiben, indem Sie verschiedene Kombinationen von Attributen/Kennzahlen auswählen, um die Visualisierung zu erstellen. Dies ist die empfohlene Art, ein Netzwerk mithilfe eines sogenannten Hive-Panels zu visualisieren.

Auf der Seite, die ich am Anfang dieses Beitrags erwähnte, sind mehrere Software-Programme aufgelistet, die diese Hive-Diagramme erstellen können, einschließlich Implementierungen in Java und R.

10
Vincent Labatut

Ich habe mich kürzlich mit diesem Problem befasst. Aus diesem Grund habe ich mir eine andere Lösung ausgedacht. Reduzieren Sie das Diagramm nach Communitys/Clustern. Dieser Ansatz ähnelt der dritten Option, die im OP oben beschrieben wurde. Als Warnung funktioniert dieser Ansatz am besten mit ungerichteten Diagrammen. Beispielsweise:

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://stackoverflow.com/questions/35000554/collapsing-graph-by-clusters-in-igraph/35000823#35000823

res_g <- simplify(contract(g, membership(c_g))) 

Das Ergebnis dieses Prozesses ist die folgende Abbildung, in der die Namen der Scheitelpunkte die Community-Mitgliedschaft darstellen.

plot(g, margin = -.5)

enter image description here

Das oben Genannte ist eindeutig schöner als dieses abscheuliche Durcheinander

plot(r_g, margin = -.5)

enter image description here

Um Communities mit ursprünglichen Vertices zu verknüpfen, benötigen Sie etwas Ähnliches wie das Folgende

mem <- data.frame(vertices = 1:vcount(g), memeber = as.numeric(membership(c_g)))

IMO ist dies aus zwei Gründen ein netter Ansatz. Erstens kann es theoretisch mit Graphen jeder Größe umgehen. Das Auffinden von Communities kann in komprimierten Diagrammen fortlaufend wiederholt werden. Zweitens würde ein interaktiver Ansatz zu sehr lesbaren Ergebnissen führen. Man kann sich beispielsweise vorstellen, dass der Benutzer auf einen Scheitelpunkt im reduzierten Diagramm klicken kann, um diese Community zu erweitern und alle ursprünglichen Scheitelpunkte anzuzeigen.

7
Jacob H

Ein weiteres interessantes Paket ist networkD . In dieser Bibliothek gibt es eine Vielzahl von Möglichkeiten zur Darstellung von Diagrammen. Insbesondere finde ich die forceNetwork eine interessante Option. Es ist interaktiv und ermöglicht es Ihnen daher, Ihr Netzwerk wirklich zu erkunden. Es ist großartig für EDA, aber vielleicht zu "wackelig" für die endgültige Arbeit.

3
Jacob H

Ich habe mich umgesehen und keine gute Lösung gefunden. Mein Ansatz war es, Knoten zu entfernen und mit Randtransparenz zu spielen. Es ist eher eine Design-Lösung als eine technische, aber ich konnte gephi-ähnliche Netzwerke mit bis zu 50.000 Rändern ohne große Komplikationen auf meinem Laptop zeichnen.

mit ihrem beispiel:

plot(simplify(g), vertex.size= 0.01,Edge.arrow.size=0.001,vertex.label.cex = 0.75,vertex.label.color = "black"  ,vertex.frame.color = adjustcolor("white", alpha.f = 0),vertex.color = adjustcolor("white", alpha.f = 0),Edge.color=adjustcolor(1, alpha.f = 0.15),display.isolates=FALSE,vertex.label=ifelse(page_rank(g)$vector > 0.1 , "important nodes", NA))

enter image description here

Beispiel von Twitter erwähnt Netzwerk mit 30.000 Kanten:

enter image description here

0
supercontra