Как назначить имена узлов матрице Networkx? - PullRequest
1 голос
/ 04 марта 2020

Я пытаюсь нарисовать график в NetworkX. Сеть соединяет 30 узлов и около 130 ребер. Узлы задаются с помощью матрицы с весом

A = [
    [0, 1.51, 0, 1.71, 0],
    [0, 0, 2.11, 1.81, 2.31],
    [0, 0, 0, 1.31, 1.41],
    [0, 0, 0, 0, 1.11],
    [0, 0, 0, 0, 0]]

Как присвоить имена узлов матрице из списка ("A1", "K2", ... "Z30")? До сих пор мне удавалось назначать имена только номерам.

import matplotlib.pyplot as plt
import networkx as nx
import numpy as np

A = [[0, 1.51, 0, 1.71, 0],
     [0, 0, 2.11, 1.81, 2.31],
     [0, 0, 0, 1.31, 1.41],
     [0, 0, 0, 0, 1.11],
     [0, 0, 0, 0, 0]]

G = nx.from_numpy_matrix(np.matrix(A), create_using=nx.DiGraph)

layout = nx.spring_layout(G)
labels = nx.get_edge_attributes(G, "weight")
lab_node = dict((i, str(i)*3) for i in range(5))
nx.draw(G, layout)
nx.draw_networkx_nodes(G, layout, node_size=500)
nx.draw_networkx_edge_labels(G, layout, edge_labels=labels)
nx.draw_networkx_labels(G, layout, labels=lab_node, font_size=10, font_family='sans-serif')
plt.show()

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Если вашей проблемой является только чертеж, вы можете использовать следующее:

import matplotlib.pyplot as plt
import networkx as nx
import numpy as np

A = [[0, 1.51, 0, 1.71, 0],
     [0, 0, 2.11, 1.81, 2.31],
     [0, 0, 0, 1.31, 1.41],
     [0, 0, 0, 0, 1.11],
     [0, 0, 0, 0, 0]]

G = nx.from_numpy_matrix(np.matrix(A), create_using=nx.DiGraph)

layout = nx.spring_layout(G)
labels = nx.get_edge_attributes(G, "weight")
# lab_node = dict((i, "A") for i in range(5))

# a list of the node labels in the right order
raw_labels = ["A1", "K2", "D3", "E4", "Z30"]
lab_node = dict(zip(G.nodes, raw_labels))

nx.draw(G, layout)
nx.draw_networkx_nodes(G, layout, node_size=500)
nx.draw_networkx_edge_labels(G, layout, edge_labels=labels)
nx.draw_networkx_labels(G, layout, labels=lab_node, font_size=10, font_family='sans-serif')
plt.show()

Если вы хотите переименовать узлы на вашем графике, вы, вероятно, ищете relabel_nodes метод.

0 голосов
/ 04 марта 2020

В качестве простого обходного пути вы можете превратить вашу матрицу смежности A в pandas DataFrame, столбцы / индексы которого представляют собой нужные метки:

import pandas as pd
import networkx as nx

A = [
    [0, 1.51, 0, 1.71, 0],
    [0, 0, 2.11, 1.81, 2.31],
    [0, 0, 0, 1.31, 1.41],
    [0, 0, 0, 0, 1.11],
    [0, 0, 0, 0, 0]]

labels = ['alice', 'bob', 'charlie', 'dan', 'ellie']

Чтобы создать DataFrame:

A2 = pd.DataFrame(A, index=labels, columns=labels)

Проверьте результат, нарисовав его, без дополнительной настройки меток (показывая, что мы уже установили его правильно):

nx.draw_networkx(nx.from_pandas_adjacency(A2))

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...