2013-09-01 13 views
6

Próbuję networkx i wizualizacji w matplotlib i jestem zdezorientowany, ponieważ nie rozumiem w jaki sposób wchodzą one w interakcje ze sobą? Istnieje prosty przykładInterakcja między networkx i matplotlib

import matplotlib.pyplot 
import networkx as nx 
G=nx.path_graph(8) 
nx.draw(G) 
matplotlib.pyplot.show() 

Gdzie mogę powiedzieć pyplot, że chcę, aby narysować wykres G? myślę, że użycie nx.draw coś matplotlib.pyplot {działka, etc ...} Więc jeśli chcę rysować wykresy: 2.

import matplotlib.pyplot 
import networkx as nx 

G=nx.path_graph(8) 
E=nx.path_graph(30) 
nx.draw(G) 

matplotlib.pyplot.figure() 
nx.draw(E) 
matplotlib.pyplot.show() 

potem ... mały eksperyment

import networkx as nx 
G=nx.path_graph(8) 
E=nx.path_graph(30) 
nx.draw(G) 
import matplotlib.pyplot 
matplotlib.pyplot.figure() 
nx.draw(E) 
import matplotlib.pyplot as plt 
plt.show() 

Proszę nie zabijać mnie o tym głupim kodzie, staram się tylko zrozumieć - w jaki sposób networkx narysuje coś matplotlib, a nawet jeszcze nie importuje!

P.S: Przepraszamy za mój angielski.

Odpowiedz

13

Wystarczy utworzyć dwie różne osie, jeśli chcesz narysować wykresy osobno lub utworzyć pojedynczy obiekt Axes i przekazać go do nx.draw. Na przykład:

G = nx.path_graph(8) 
E = nx.path_graph(30) 

# one plot, both graphs 
fig, ax = subplots() 
nx.draw(G, ax=ax) 
nx.draw(E, ax=ax) 

dostać:

enter image description here

Jeśli chcesz dwa różne obiekty postać następnie utworzyć je oddzielnie, tak jak poniżej:

G = nx.path_graph(8) 
E = nx.path_graph(30) 

# two separate graphs 
fig1 = figure() 
ax1 = fig1.add_subplot(111) 
nx.draw(G, ax=ax1) 

fig2 = figure() 
ax2 = fig2.add_subplot(111) 
nx.draw(G, ax=ax2) 

otrzymując:

enter image description here enter image description here

Wreszcie, można utworzyć subplot jeśli chciał coś takiego:

G = nx.path_graph(8) 
E = nx.path_graph(30) 

pos=nx.spring_layout(E,iterations=100) 

subplot(121) 
nx.draw(E, pos) 

subplot(122) 
nx.draw(G, pos) 

skutkuje:

enter image description here

Na co warto wygląda ax argumentu to nx.draw jest bezużyteczne z interfejsem API matplotlib, gdy chcesz utworzyć sub działki poza pylab, ponieważ nx.draw ma kilka połączeń z gca, co czyni go zależnym od interfejsu pylab. Nie zastanawiałem się, dlaczego tak jest, tylko myślałem, że to wskażę.

Kod źródłowy do nx.draw jest dość prosta:

try: 
    import matplotlib.pylab as pylab 
except ImportError: 
    raise ImportError("Matplotlib required for draw()") 
except RuntimeError: 
    print("Matplotlib unable to open display") 
    raise 

cf=pylab.gcf() 
cf.set_facecolor('w') 
if ax is None: 
    if cf._axstack() is None: 
     ax=cf.add_axes((0,0,1,1)) 
    else: 
     ax=cf.gca() 

# allow callers to override the hold state by passing hold=True|False 

b = pylab.ishold() 
h = kwds.pop('hold', None) 
if h is not None: 
    pylab.hold(h) 
try: 
    draw_networkx(G,pos=pos,ax=ax,**kwds) 
    ax.set_axis_off() 
    pylab.draw_if_interactive() 
except: 
    pylab.hold(b) 
    raise 
pylab.hold(b) 
return 
  1. A rysunek jest zrobione ze środowiska z wykorzystaniem gcf.
  2. Następnie obiekt Axes jest dodawany do rysunku, jeśli taki nie istnieje, w przeciwnym razie można go pobrać ze środowiska przy użyciu gca.
  3. Bądź kolor działka twarz białą
  4. turze hold na
  5. wyciągnąć go z funkcją wewnętrznego
  6. wyłączyć osi
  7. wreszcie, czy jesteśmy w trybie interaktywnym, wyciągnąć go i przebijać żadnych wyjątków zostali złapani
+0

Wielkie dzięki za wspaniały przegląd i odpowiedź! – user1113159

Powiązane problemy