2015-04-20 9 views
7

Próbuję utworzyć znakowany wykres za pomocą sieci sieciowej, ale mam problem z prawidłowym włączeniem węzłów i etykiet. W skrócie, etykiety nie są wyrównane do właściwych węzłów i istnieją pewne węzły, które nie mają krawędzi po wyświetleniu.Wyświetlanie wykresu sieciowego z etykietami

Najpierw utworzyłem wykres, dodałem węzły i krawędzie, a następnie dodałem etykiety.

Dane wykres pochodzi z obiektu pandy DataFrame z dwoma kolumnami, pracownika i menedżera nazwami:

   emp_name    mgr_name 
0  Marianne Becker     None 
1   Evan Abbott  Marianne Becker 
2    Jay Page  Marianne Becker 
3    Seth Reese  Marianne Becker 
4   Maxine Collier  Marianne Becker 

...

Każdy węzeł jest nazwą, a krawędzie są mgr_name do emp_name relacje .

Mój kod wykres:

import networkx as nx 
G=nx.DiGraph() 

#set layout 
pos=nx.spring_layout(G) 

#add nodes 
G.add_nodes_from(df.emp_name) 
G.nodes() 
G.add_node('None') 

#create tuples for edges 
subset = df[['mgr_name','emp_name']] 
tuples = [tuple(x) for x in subset.values] 

#add edges 
G.add_edges_from(tuples) 
G.number_of_edges() 

#draw graph 
import matplotlib.pyplot as plt 
nx.draw(G, labels = True) 
plt.show() 

Idealnie byłoby mam drzewiastą strukturę z nazwiskami pracowników jak etykiet dla każdego z węzłów.

wyjściowy obraz jest enter image description here

+0

Jaka jest odpowiedź na 'G.number_of_edges()'? Byłoby wspaniale, gdybyś mógł dodać obraz - nie sądzę, żebyś miał dość "reputacji", aby to zrobić, ale czy możesz umieścić go gdzieś online i opublikować link? Nie widzę żadnego oczywistego błędu. – Joel

+0

Czy było to jednak posortowane? –

Odpowiedz

12

NetworkX posiada szereg funkcji do rysowania wykresów, lecz także umożliwiają użytkownikowi precyzyjną kontrolę nad całym procesem.

draw jest proste i jego docstring szczególności wymienia:

Draw wykres Jako, że prosty, bez nodeabels lub krawędź etykiet i za pomocą pełnych matplotlib obszary postać etykiety domyślnie. Patrz draw_networkx() przez fatured rysunku, który umożliwia tytuł, oś etykiet

Funkcje poprzedzone przez draw_networkx następnie edges, nodes, edge_labels i edge_nodes umożliwiających lepszą kontrolę w całym procesie ciągnienia.

Twój przykład zadziałał prawidłowo podczas korzystania z draw_networkx.

Ponadto, jeśli szukasz wyjścia przypominającego organogram, sugeruję użycie graphviz przez siećx. Graphviz's dot jest idealny dla tego rodzaju schematów (proszę również see this dla kropki).

W dalszej Próbowałem zmodyfikować kod nieznacznie wykazać korzystania z obu funkcji:

import networkx as nx 
import matplotlib.pyplot as plt 
import pandas 

#Build the dataset 
df = pandas.DataFrame({'emp_name':pandas.Series(['Marianne Becker', 'Evan Abbott', 'Jay Page', 'Seth Reese', 'Maxine Collier'], index=[0,1,2,3,4]), 'mgr_name':pandas.Series(['None', 'Marianne Becker', 'Marianne Becker', 'Marianne Becker', 'Marianne Becker'], index = [0,1,2,3,4])}) 

#Build the graph 
G=nx.DiGraph() 
G.add_nodes_from(df.emp_name) 
G.nodes() 
G.add_node('None') 
# 
#Over here, you are manually adding 'None' but in reality 
#your nodes are the unique entries of the concatenated 
#columns, i.e. emp_name, mgr_name. You could achieve this by 
#doing something like 
# 
#G.add_nodes_from(list(set(list(D.emp_name.values) + list(D.mgr_name.values)))) 
# 
# Which does exactly that, retrieves the contents of the two columns 
#concatenates them and then selects the unique names by turning the 
#combined list into a set. 

#Add edges 
subset = df[['mgr_name','emp_name']] 
tuples = [tuple(x) for x in subset.values] 
G.add_edges_from(tuples) 
G.number_of_edges() 

#Perform Graph Drawing 
#A star network (sort of) 
nx.draw_networkx(G) 
plt.show() 
t = raw_input() 
#A tree network (sort of) 
nx.draw_graphviz(G, prog = 'dot') 
plt.show() 

Można również spróbować użyć kropki Graphviz jest z linii poleceń bezpośrednio, zapisując swoje NetworkX sieci poprzez nx.write_dot.Aby to zrobić:

z poziomu skryptu Pythona:

nx.write_dot(G, 'test.dot') 

Po tym, z (Linux) linii poleceń i przy założeniu, że masz zainstalowany Graphviz:

dot test.dot -Tpng>test_output.png 
feh test_output.png #Feh is just an image viewer. 
firefox test_output.png & #In case you don't have feh installed. 

Dla bardziej typowy format organogramu, możesz wymusić ortogonalne trasowanie krawędzi przez:

dot test.dot -Tpng -Gsplines=ortho>test_output.png 

Wreszcie, tutaj są outpu ts

Wyjście draw_networkx Output of <code>draw_networkx</code>

wyjściu draw_graphviz Output of <code>draw_graphviz</code>

Wyjście dot bez prostopadłych krawędziach Output of <code>dot</code> without orthogonal edges

Wyjście dot z prostopadłych krawędziach Output of <code>dot</code> with orthogonal edges

Nadzieja to pomaga.

Powiązane problemy