2016-09-03 5 views
1

я собираюсь через данные научной книги O'Reilly и это дает вам код питона более или менее создать этот узел именно ...Как выровнять узлы и ребра NetworkX

enter image description here

Но он не говорит вам, как сделать а именно, как его на самом деле не имеет отношения к теме, но я хотел взять трещины на него в любом случае, и до сих пор это так близко, как я пришел

users = [ 
{ "id": 0, "name": "Hero" }, 
{ "id": 1, "name": "Dunn" }, 
{ "id": 2, "name": "Sue" }, 
{ "id": 3, "name": "Chi" }, 
{ "id": 4, "name": "Thor" }, 
{ "id": 5, "name": "Clive" }, 
{ "id": 6, "name": "Hicks" }, 
{ "id": 7, "name": "Devin" }, 
{ "id": 8, "name": "Kate" }, 
{ "id": 9, "name": "Klein" }, 
{ "id": 10, "name": "Jen" } 
] 

friendships = [(0, 1), (0, 2), (1, 2), (1, 3), (2, 3), (3, 4), 
      (4, 5), (5, 6), (5, 7), (6, 8), (7, 8), (8, 9)] 

import networkx as nx 
import matplotlib as plt 
%matplotlib inline 
G=nx.Graph() 
G.add_nodes_from([user["id"] for user in users]) 
G.add_edges_from(friendships) 
pos = nx.spring_layout(G) 
nx.draw_networkx(G, pos, node_size=1000) 

enter image description here

Это совершенно новое для меня как python, так и networkx. Я не могу понять из их документации, какой фактический график я должен использовать, - я пробовал почти все из них, и никто не довел меня туда - возможно ли это в networkx для выравнивания узлов таким образом и каков правильный граф?

Является ли networkx правильным инструментом для этой работы, есть ли лучший python lib для этой задачи?

UPDATE

@Aric ответ был совершенным, но я сделал пару изменений, чтобы сделать узлы совпадают с данными, а не массив статического типа. Я не думаю, что это «лучший» способ сделать расчет, который кто-то с большим опытом python будет знать лучше. Я играл с минимальными размерами и положениями для немного и все-таки я не мог заставить его пиксельной совершенным, но до сих пор я очень доволен конечным результатом

import networkx as nx 
import matplotlib.pyplot as plt 
G=nx.Graph() 
G.add_nodes_from([user["id"] for user in users]) 
G.add_edges_from(friendships) 
pos = {0: [0,0], 
     1: [4,-0.35], 
     2: [4,0.35], 
     3: [8,0], 
     4: [12,0], 
     5: [16,0], 
     6: [20,0.35], 
     7: [20,-0.35], 
     8: [24,0], 
     9: [28,0], 
     10: [32,0]} 

nodes = [user["id"] for user in users] 
def calcSize(node): 
    minSize = 450 
    friends = number_of_friends(node) 
    if friends <= 0: 
     return minSize 
    return minSize * friends 

node_size = [(calcSize(user)) for user in users] 
nx.draw_networkx(G, pos, nodelist=nodes, node_size=node_size, node_color='#c4daef') 
plt.ylim(-1,1) 
plt.axis('off') 

ответ

1

Вы можете так-то подобное с NetworkX. Вам нужно использовать другой метод компоновки, чем «spring_layout» или установить позиции узла явно, как это:

import networkx as nx 
import matplotlib.pyplot as plt 
G=nx.Graph() 
G.add_nodes_from([user["id"] for user in users]) 
G.add_edges_from(friendships) 
pos = {0: [0,0], 
     1: [1,-0.25], 
     2: [1,0.25], 
     3: [2,0], 
     4: [3,0], 
     5: [4,0], 
     6: [5,0.25], 
     7: [5,-0.25], 
     8: [6,0], 
     9: [7,0], 
     10: [8,0]} 

nodes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
node_size = [500, 1000, 1000, 1000, 500, 1000, 500, 500 , 1000, 300, 300] 
nx.draw_networkx(G, pos, nodelist=nodes, node_size=node_size, node_color='#c4daef') 
plt.ylim(-1,1) 
plt.axis('off') 

enter image description here

Смежные вопросы