я собираюсь через данные научной книги O'Reilly и это дает вам код питона более или менее создать этот узел именно ...Как выровнять узлы и ребра NetworkX
Но он не говорит вам, как сделать а именно, как его на самом деле не имеет отношения к теме, но я хотел взять трещины на него в любом случае, и до сих пор это так близко, как я пришел
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)
Это совершенно новое для меня как 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')