В этом руководстве мы узнаем о пакете 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.