2016-04-20 8 views
1

Ich implementiere ein Networkx-Diagramm, um meine Daten zu analysieren, aber da es eine riesige Kombination zwischen den Firmen (erste Spalte von Daten in der Verbindung) und Agenten (zweite Spalte von Daten in der Verbindung) gibt, ist die Grafik unklar.Wie kann ich die Netzwerkx-Plot-Verteilung und Visualisierung verändern?

Wie kann ich das Diagramm ändern, um die Überlappung der Knoten zu reduzieren?

Die Daten: https://www.dropbox.com/s/vc7ivgbrbluv6ed/data_to_plot.txt?dl=0

mein Code:

import networkx as nx 
import matplotlib as plt 
import pandas as pd 
import os 
import pylab 

# load the data  
network_to_plot = pd.read_csv('data_to_plot.txt',sep=" ", header = None) 

# formatting the data 
agents_vector = [tuple(x) for x in network_to_plot.to_records(index=False)] 

# start the graph 
G = nx.DiGraph() 

G.add_edges_from(agents_vector) 

pos=nx.spring_layout(G) 
nx.draw(G,pos,edge_cmap=plt.cm.Reds) 
pylab.savefig("network_based_on_firms.png") 

das Ergebnis:

enter image description here

+0

Related: http://stackoverflow.com/q/15667166/190597 – unutbu

Antwort

0

Zwei mögliche Wege.
Eine ist, eine bessere Layoutfunktion zu verwenden, vielleicht shell_layout() oder circular_layout().
Das andere ist, die Struktur zu verstehen, die die Layoutfunktionen erzeugen, und Ihr Verständnis der Daten zu verwenden, um eine vernünftigere Visualisierung zu erzeugen. Diese Funktionen erzeugen ein Wörterbuch, das auf den Knoten mit Werten codiert ist, die Listen der Länge 2 sind. Der erste Eintrag gibt die x-Position des Knotens an, die zweite, die y.
Nehmen Sie dieses Beispiel, eine Grafik von Netzwerkverbindungen zwischen Büros.

pos=nx.spring_layout(G) 
print pos 

könnte jedoch so etwas wie

{'A': [1, 12], 'C': [5, 8], 'B': [4, 11], 'E': [8, 3], 'D': [8, 7], 'F': [6, 1]} 

ergeben, ich weiß, dass da meine Daten citites stellt es Sinn macht, die Knoten an Stellen angezeigt werden, die ihre physischen Positionen darstellen, so dass ich stattdessen bauen sie meine eigenes Wörterbuch.

pos = {} 
for node in G.nodes(): 
    pos[node] = [G.node[node]["x"], G.node[node]["y"]] 

Sie scheinen Ihre Daten gut im Griff zu haben. Verwenden Sie es zu Ihrem Vorteil. In Ihrem speziellen Fall scheint es, gibt es zwei Hauptkategorien, Agenten und Firmen. Vielleicht teilen Sie Ihre Grafikvisualisierung in 3 Spalten auf: Eine "Agentenzone" und eine "Randzone" und eine "feste" Zone. Iterieren durch die Knoten und weisen X- und Y-Werte zu, die die entsprechende Zone im Zick-Zack-Verfahren durchlaufen (die Randzone enthält keine Knoten, um die Verbindung zu verdeutlichen). Bei vielen Knoten können Daten immer noch ziemlich unscharf sein. Geben Sie den Knoten möglicherweise Y-Abstände basierend auf der Anzahl der Verbindungen. Fiedel mit Proportionalitäten und anderen Mustern und du solltest in der Lage sein, etwas zu erzeugen, das es wert ist, betrachtet zu werden. Holen Sie die Firma mit den wenigsten Agenten nach unten und platzieren Sie anschließend alle Agenten, die mit ihr verbunden sind, im unteren Bereich der Agentenzone. Dann gehe zur nächsten Firma, platziere alle damit verbundenen Agenten, die noch nicht platziert wurden, und so weiter. Setzen Sie jedes Unternehmen auf den mittleren y-Wert der Zone von Agenten, die es abbildet. Die Möglichkeiten sind endlos.

1

Die Position der Knoten in Ihrem Diagramm durch die Funktion bestimmt wird spring_layout, Siehe den Link für die Dokumentation.

Sie können beginnen, indem Sie die Anzahl der Iterationen erhöhen, die zur Berechnung einer optimalen Position verwendet werden. Ich denke, Sie werden auch davon profitieren, ein niedrigeres k als der Standard (1/sqrt (Knoten)) zu setzen.

Wenn diese fehlschlagen, können Sie die additional networkx layout calculators betrachten.

+0

Ich modifiziere das Layout von "Spring_layout" zu "Random_layout", aber das Diagramm ist das gleiche. –

+0

Haben Sie den Code geändert, um zu sagen: 'pos = nx.random_layout (G)', und den Plot reproduzieren? – Thomite

+0

Ja. Ich ändere für "pos = nx.random_layout (G)", aber ich konnte das Problem ändern. (Link beigefügt). Gibt es eine Funktion, um die Knoten zu "explodieren" und das Diagramm besser zu machen? [link] (https://www.dropbox.com/s/jzdq6rh9uryfars/network_based_on_firms.png?dl=0) –