В этом руководстве мы узнаем о пакете NetworkX для Python. NetworkX означает сетевой анализ в Python. Он в основном используется для создания, управления и изучения сложных графиков. Это первая часть руководства по NetworkX. Оставшееся руководство будет размещено в разных частях.

Предварительные требования: базовые знания теории графов и программирования на Python.

NetworkX - это пакет Python для создания, управления и изучения структуры, динамики и функций сложных сетей. - https://networkx.org/

Установка

Если пакет NetworkX не установлен в вашей системе, вы должны сначала установить его. Вы можете использовать следующую команду для его установки.

pip install networkx

Приведенная выше команда установит пакет NetworkX в вашу систему. Теперь вы готовы его использовать. Иногда указанная выше команда может выдавать сообщение об ошибке. В этом случае рекомендуется использовать команду pip3 вместо pip. Это зависит от того, как настроена ваша система.

Импорт

Вы можете использовать модуль «networkx», импортировав его с помощью следующей команды:

import networkx as nx

Теперь модуль «networkx» доступен под псевдонимом «nx». Вы можете использовать любые псевдонимы, хотя «nx» является наиболее часто используемым псевдонимом для модуля «networkx» в Python.



Создать пустой график

Чтобы создать пустой график, мы используем следующую команду:

G = nx.Graph()

Приведенная выше команда создаст пустой график. Пустой граф - это граф, множество вершин и множество ребер которого пусты.

Чтобы получить доступ к набору вершин и набору ребер графа G, мы можем использовать следующую команду:

print(G.nodes()) # returns a list
print(G.edges()) # returns a list

И G.nodes (), и G.edges возвращают списки Python. Очевидно, что две приведенные выше команды вернут два пустых списка, потому что мы не добавили никаких узлов или ребер в граф G.

Добавление узлов

Предположим, мы хотим добавить вершину (также называемую узлом) в G. В этом руководстве вершина и узел будут использоваться как синонимы. Мы можем добавить узел в G следующим образом:

G.add_node(“A”)

Приведенная выше команда добавит один узел A в граф G. Если мы хотим добавить сразу несколько узлов, мы можем использовать следующую команду:

G.add_nodes_from([“B”,”C”,”D”,”E”])

Приведенная выше команда добавит четыре вершины (или узлы) в граф G. Теперь граф G имеет пять вершин A, B, C, D и E. Это просто изолированные вершины, потому что мы не добавили никаких ребер в граф G. .

Добавление краев

Мы можем добавить ребро, соединяющее два узла A и B, следующим образом:

G.add_edge(*(“A”,”B”))

Приведенная выше команда создаст ребро (A, B) в графе G. Несколько ребер можно добавить одновременно, используя следующую команду:

G.add_edges_from([(“A”,”C”), (“B”,”D”), (“B”,”E”), (“C”, “E”)])

Вышеупомянутая команда создаст еще четыре ребра в G. Теперь у G всего пять ребер.



Доступ к наборам вершин и ребер

Доступ к набору вершин и набору ребер G можно получить с помощью G.nodes () и G.edges () соответственно. Эти две команды вернут списки Python.

print("Vertex set: ",G.nodes())

Результат выполнения вышеуказанной команды показан ниже:

Vertex set: [‘A’, ‘B’, ‘C’, ‘D’, ‘E’]

Точно так же мы можем получить доступ к набору ребер G следующим образом:

print("Edge set: ",G.edges())

Вывод вышеуказанного оператора печати упомянут ниже:

Edge set: [(‘A’, ‘B’), (‘A’, ‘C’), (‘B’, ‘D’), (‘B’, ‘E’), (‘C’, ‘E’)]


График рисования

Мы можем легко нарисовать график с помощью модуля «networkx». Для его рисования мы используем библиотеку matplotlib. Итак, нам нужно сначала импортировать его.

import matplotlib.pyplot as plt

Теперь созданный выше график (G) можно нарисовать с помощью следующей команды:

nx.draw(G)
plt.show() 

Мы можем использовать функцию savefig (), чтобы сохранить сгенерированную фигуру в любом желаемом формате файла. В следующей команде он сохраняется в формате PNG. Мы также можем сохранить его в формате EPS, JPEG и т. Д.

plt.savefig(“graph.png”) 

Мы также можем использовать следующие атрибуты в функции nx.draw (), чтобы рисовать G с метками вершин.

nx.draw(G, with_labels=True, font_weight=’bold’)
plt.show()

Обратите внимание, что мы можем получить разные макеты одного и того же графа G в разных прогонах одного и того же кода. В конце концов, они представляют один и тот же граф G. На рисунке 2 упомянуты метки вершин.

Используя модуль «nextworkx», мы можем создавать некоторые хорошо известные графики, например, граф Петерсона. Команда упоминается ниже:

GP = nx.petersen_graph()

Здесь GP - график Петерсона. Теперь мы рисуем граф GP, как обсуждалось выше.

nx.draw(GP, with_labels=True, font_weight=’bold’)
plt.show()



Просмотр смежности

Мы можем получить представление о смежности графа, используя модуль «networkx». Это то же самое, что и список смежности графа. В следующей команде мы печатаем представление смежности G.

print(G.adj)

Приведенный выше оператор печати сгенерирует представление смежности графа G.

{‘A’: {‘B’: {}, ‘C’: {}}, ‘B’: {‘A’: {}, ‘D’: {}, ‘E’: {}}, ‘C’: {‘A’: {}, ‘E’: {}}, ‘D’: {‘B’: {}}, ‘E’: {‘B’: {}, ‘C’: {}}}

Следовательно, вершина A смежна с вершинами B, C и так далее (см. Рисунок 2).

Степень вершины

Степень вершины определяется количеством инцидентных ей ребер. Следующая команда определяет степень вершины A в графе G.

G.degree("A")

Результатом вышеупомянутого оператора является 2. Это также можно проверить с помощью представления смежности G.

Создание взвешенного графа

Теперь мы узнаем, как создать взвешенный граф с помощью модуля «networkx» в Python. Здесь взвешенный граф представляет собой граф со взвешенными ребрами. В общем, мы рассматриваем веса ребер как неотрицательные числа.

В следующем примере E - это список Python, содержащий пять элементов. Каждый из этих элементов представляет собой кортеж Python, состоящий из трех элементов. Первые два элемента обозначают две конечные точки ребра, а третий элемент представляет вес этого ребра. Наконец, нам нужно добавить эти взвешенные ребра к G.

G = nx.Graph() 
E = [(‘A’, ‘B’, 2), (‘A’, ‘C’, 1), (‘B’, ‘D’, 5), (‘B’, ‘E’, 3), (‘C’, ‘E’, 2)]
G.add_weighted_edges_from(E)

Выше мы уже видели, как нарисовать невзвешенный график. Теперь мы узнаем, как нарисовать взвешенный граф с помощью модуля «networkx» в Python. Полный код приведен ниже:

pos=nx.spring_layout(G)
nx.draw(G, pos, with_labels=True, font_weight=’bold’)
edge_weight = nx.get_edge_attributes(G,’weight’)
nx.draw_networkx_edge_labels(G, pos, edge_labels = edge_weight)
plt.show()

Приведенный выше сегмент кода нарисует график, как показано на рисунке 4.

Это конец первой части этого руководства. В следующих частях этого руководства будут обсуждаться дополнительные функции модуля «networkx» в Python.