NetoworkX устанавливает ширину кромки в соответствии с весом - PullRequest
0 голосов
/ 29 мая 2020

У меня есть массив numpy:

[[12,  1,  5,  2,  2,  2,  1,  3,  1,  2],
   [ 1, 10,  3,  2,  1,  7,  2,  6,  1,  0],
   [ 5,  3, 26,  5,  1,  5,  2, 11,  3,  5],
   [ 2,  2,  5, 11,  1,  2,  1,  7,  2,  4],
   [ 2,  1,  1,  1, 17,  2,  1,  6,  2,  2],
   [ 2,  7,  5,  2,  2, 22, 12,  8,  1,  0],
   [ 1,  2,  2,  1,  1, 12, 21,  7,  0,  1],
   [ 3,  6, 11,  7,  6,  8,  7, 23,  0,  5],
   [ 1,  1,  3,  2,  2,  1,  0,  0,  3,  1],
   [ 2,  0,  5,  4,  2,  0,  1,  5,  1,  4]]

Я пытаюсь создать двухмерный сетевой график, такой как этот - внизу страницы (только 2D).
Я нашел библиотеку под названием networkx, в которой есть довольно простая функция для создания 2D-графика из массива numpy:

import networkx as nx
G = nx.from_numpy_matrix(array)
nx.draw(G, with_labels=1)

enter image description here Но это не так. интерактивный.
Я также пытаюсь заменить метки на графике фактическими метками массива (которые представляют собой строки - скажем, «один», «два» ... «десять»). Наконец, цель состоит в том, чтобы граф имел ребра, ширина которых равна числу в массиве.

1 Ответ

1 голос
/ 29 мая 2020

Через nx.draw вы можете настроить визуализацию в соответствии с большинством упомянутых требований. Хотя в некоторых случаях вам может потребоваться использовать другие параметры, доступные в Drawing , например nx. draw_networkx_nodes et c. для дальнейшей настройки.

В этом случае и при условии, что у вас есть массив с именами меток, которые вы хотите установить, вы можете использовать nx.draw_networkx_labels и указать сопоставление меток с помощью словарь, который можно определить как:

G = nx.from_numpy_matrix(a)

nodelist = G.nodes()
num_words = ['Zero', 'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine']
d_labels = dict(zip(nodelist, num_words))

Обратите внимание, что при использовании nx.from_numpy_matrix фактические значения в массиве устанавливаются как край weights, поэтому вы можете использовать nx.get_edge_attributes для получения соответствующего края ширина.

widths = nx.get_edge_attributes(G, 'weight')

Ширину можно позже установить в nx.draw_networkx_edges с помощью параметра width. Наконец, что касается интерактивности графика, вы можете посмотреть на node_picking.

Собрав все вместе, мы можем построить график как:

plt.figure(figsize=(18,13))

pos = nx.spring_layout(G, scale=0.2)
nx.draw_networkx_nodes(G,pos,
                       nodelist=nodelist,
                       with_labels=True,
                       node_size=1500,
                       node_color='black',
                       font_color='white',
                       alpha=0.7)
nx.draw_networkx_edges(G,pos,
                       edgelist = widths.keys(),
                       width=list(widths.values()),
                       edge_color='orange',
                       alpha=0.6)
nx.draw_networkx_labels(G, pos=pos,
                        labels=d_labels,
                        font_color='white')
plt.box(False)
plt.show()

enter image description here

...