2017-09-11 3 views
0

Ich habe eine adjacency matrix A und eine Anordnung definieren, die Koordinaten jedes Knotens:Netzgraph nicht Pfeile entlang der Kante in Python zeigt

import numpy as np 
import matplotlib.pyplot as plt 
import networkx as nx 
%matplotlib inline 

Import adjacency matrix A[i,j] 
A = np.matrix([[0, 1, 1, 0, 0, 1, 0], 
       [0, 0, 1, 1, 0, 0, 0], 
       [0, 0, 0, 1, 1, 1, 0], 
       [0, 0, 0, 0, 1, 1, 0], 
       [0, 0, 0, 0, 0, 0, 1], 
       [0, 0, 0, 0, 0, 0, 1], 
       [0, 0, 0, 0, 0, 0, 0]]) 

## Import node coordinates 
xy = np.array([[0, 0], 
       [-20, 20], 
       [17, 27], 
       [-6, 49], 
       [15, 65], 
       [-20, 76], 
       [5, 100]]) 

Ihr Ziel ist die Grafik zu zeichnen anzeigt, wie die Knoten untereinander verbinden, . Daher sollte jede Kante einen Pfeil oder einen bidirektionalen Pfeil haben, der angibt, in welche Richtung sie sich fortbewegen soll.

Ich konnte die Konnektivität anzeigen, aber es gibt keine Pfeile, obwohl ich den Parameter als True angegeben habe.

## Draw newtwork 
G = nx.from_numpy_matrix(A, xy) 
nx.draw_networkx(G, pos=xy, width=3, arrows=True) 

Können Sie bitte einen Weg vorschlagen, mich um mein Ziel zu erreichen, ohne die Eingabedaten zu modifizieren (A und xy)?

enter image description here

Antwort

2

ich es geschafft, "Pfeile" zu bekommen. Wenn man nach anderen Fragen zum Stapelüberlauf sucht (here, und here), scheint es, als ob dies der beste Weg ist, Pfeile mit Matplotlib zu erhalten.

import numpy as np 
import networkx as nx 
import matplotlib.pyplot as plt 


#Import adjacency matrix A[i,j] 
A = np.matrix([[0, 1, 1, 0, 0, 1, 0], 
       [0, 0, 1, 1, 0, 0, 0], 
       [0, 0, 0, 1, 1, 1, 0], 
       [0, 0, 0, 0, 1, 1, 0], 
       [0, 0, 0, 0, 0, 0, 1], 
       [0, 0, 0, 0, 0, 0, 1], 
       [0, 0, 0, 0, 0, 0, 0]]) 

## Import node coordinates 
xy = np.array([[0, 0], 
       [-20, 20], 
       [17, 27], 
       [-6, 49], 
       [15, 65], 
       [-20, 76], 
       [5, 100]]) 

G = nx.from_numpy_matrix(np.array(A), create_using = nx.MultiDiGraph()) 
pos = xy 
nx.draw(G,pos) 
labels = {i: i + 1 for i in G.nodes()} 
nx.draw_networkx_labels(G, pos, labels, font_size=15, arrows=True) 
plt.show() 

output

+0

Wenn Sie die Etiketten auf der Oberseite der Knoten wollen, müssen Sie auch die Positionen zu 'nx.draw' passieren. – Paul

+0

danke! den Code bearbeitet – smundlay

3

Irgendwann bekam ich den Mangel an richtigen Pfeil Unterstützung in den NetworkX Ziehanlagen sehr verärgert und meine eigene geschrieben, während die API so ziemlich das gleiche zu halten. Code kann here gefunden werden.

enter image description here

import numpy as np 
import netgraph 

A = np.matrix([[0, 1, 1, 0, 0, 1, 0], 
       [0, 0, 1, 1, 0, 0, 0], 
       [0, 0, 0, 1, 1, 1, 0], 
       [0, 0, 0, 0, 1, 1, 0], 
       [0, 0, 0, 0, 0, 0, 1], 
       [0, 0, 0, 0, 0, 0, 1], 
       [0, 0, 0, 0, 0, 0, 0]]) 

xy = np.array([[0, 0], 
       [-20, 20], 
       [17, 27], 
       [-6, 49], 
       [15, 65], 
       [-20, 76], 
       [5, 100]]) 

N = len(A) 
node_labels = dict(zip(range(N), range(N))) 
netgraph.draw(np.array(A), xy/np.float(np.max(xy)), node_labels=node_labels) 
Verwandte Themen