Как вывести граф в python
Перейти к содержимому

Как вывести граф в python

  • автор:

How to Represent a Graph Data Structure in Python

Fahadul Shadhin

Graph is an important data structure studied in Computer Science. Graph theory is an equally important topic in both mathematics and Computer Science.

Representing a graph in a program means finding a way to store the graph in a computer’s memory. Which is a prerequisite to working with graphs in…

Отображение графа на Python с networkx

Граф — это форма визуализации, позволяющая показывать и анализировать отношения между сущностями. Например, рисунок ниже показывает вклад редакторов Википедии на различных языках энциклопедии в июле 2013 года:


Можно сделать несколько наблюдений:

  • Английский (en) — основной язык, на который переводятся все остальные языки; в то же время многие англоязычные материалы переводятся на другие языки.
  • Китайский (zh) переводится на японский (ja), но не наоборот.
  • И китайский, и японский материалы переведены на английский, и наоборот.

Я же расскажу о том, как для отображения графов использовать пакет networkx.

Установка networkx

Чтобы установить этот пакет, используйте команду pip:

Терминология

Прежде чем начать отрисовку графа, полезно знать некоторые основы.
На рисунке ниже показывается направленный граф, также известный как диграф, ребра которого имеют обозначенные стрелками направления.

  • Узел — фундаментальный элемент графа, общеизвестный под названием вершина.
  • Ребро — соединение узлов графа.
  • Неориентированный граф не имеет направления между узлами, то есть не имеет стрелок, а его ребра двунаправлены.

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

Давайте шаг за шагом создадим граф.

Во-первых, создадим объект класса networkx.classes.graph.Graph:

Класс nx.Craph() создает неориентированный граф. Если захочется создать ориентированный, используйте класс nx.DiGraph(directed=True), который возвращает объект networkx.classes.digraph.DiGraph.

В этой статье поговорим об ориентированных графах.

Добавим узлы

Фрагмент кода ниже добавляет три узла без ребер:

Помимо функции add_node() для добавления индивидуальных узлов, чтобы добавить множество узлов, можно воспользоваться функцией add_nodes_from():

Сейчас у графа 5 узлов.

Добавим ребра

Теперь, когда узлы определены, определим ребра, чтобы соединить их:

Как и узлы, ребра можно добавлять по одному, при помощи add_edge(), или группами — при помощи add_edges_from() со списком кортежей, представляющих каждый узел.

Рисуем граф

Я покажу основы отображения сетевых графов при помощи пакета networkx. Начнем:

Вы увидите что-то такое:

Вот другое изображение того же графа:

Отображение меток

Само собой, граф без меток не очень полезен, если вообще полезен, поэтому давайте отрисуем метки:

  • nx.draw_networkx_nodes() — рисует все узлы графа;
  • nx.draw_networkx_labels() — рисует метки на каждом узле;
  • nx.draw_networkx_edges() — рисует ребра, соединяющие узлы.

И теперь мы видим метку каждого узла:

Применение макетов

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

Узлы упорядочены так, что по ним можно очертить круг:

Кроме того, график с круговой компоновкой можно нарисовать с помощью nx.draw_circular(), а не nx.draw():

Можно попробовать другие макеты:

  • nx.draw_kamada_kawai(G, with_labels = True);
  • nx.draw_planar(G, with_labels = True);
  • nx.draw_random(G, with_labels = True);
  • nx.draw_spectral(G, with_labels = True);
  • nx.draw_spring(G, with_labels = True);
  • nx.draw_shell(G, with_labels = True);

Разметка ребер

Ребра можно отметить при помощи nx.draw_networkx_edge_labels(). Фрагмент кода ниже размечает два ребра трех узлов:

Ориентированный граф

Иногда полезно построить ориентированный граф. В нашем примере ребра могут представлять рейсы между двумя городами. Ориентированный граф позволяет увидеть, какие рейсы идут из одного города в другой. Следующий фрагмент кода показывает наш пример в виде ориентированного графа:

Теперь вы видите, что есть рейсы из Сингапура в Сан-Франциско и наоборот; с другой стороны, есть рейсы из Риги в Сан-Франциско, но не наоборот:

Настройка узлов

По умолчанию узлы имеют синий цвет и довольно маленький размер. Настроить узлы и цвет ребра можно, передав словарь в функцию draw():

Сейчас узлы желтые и они больше, а ребра синие:

Очерчивание узлов

Если вы хотите обозначить узлы, вам нужно сделать это вручную, используя matplotlib. Следующий фрагмент кода задает размер рисунка 10 на 10 дюймов (ширина и высота), а затем функцией set_edgecolor() рисует контур каждого узла:

Теперь каждый узел обведен черным:

Если не установить размер рисунка, граф будет выглядеть так:

Раскрашивание узлов

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

И теперь узлы графа раскрашены разными цветами:

Если захочется указать свой цвет, установите его вручную:

Вот и все на сегодня. А на наших курсах — полезная теория и много практики:

Name already in use

Preprocessing / Networkx.md

  • Go to file T
  • Go to line L
  • Copy path
  • Copy permalink
  • Open with Desktop
  • View raw
  • Copy raw contents Copy raw contents

Copy raw contents

Copy raw contents

Графы (сети), библиотека networkx

С использованием материалов Оксаны Дерезы

Что такое графы?

Чтобы что-то научно исследовать, мы строим модель, то есть упрощённую схему, исследуемого предмета. Карта — модель пространства и того, что в нём находится, грамматическое описание — модель реальной грамматической системы языка, а глоссированный текст — модель текста настоящего, произнесённого. В модель мы берём какие-то важные для нас данные, а другие отбрасываем, считая их неважными. Например, физики часто пренебрегают таким свойством предмета, как его размер, принимая во внимание только массу, скорость и ряд других характеристик, а сам объект считая «материальной точкой», то есть своего рода абстракцией (в реальности не может существовать предмет без пространственных характеристик).

Частотный словарь — тоже модель, это модель реального текста, в которой мы важными параметрами, которые мы взяли в нашу модель, считаем сами слова и частоту их употребления. Но при этом мы отказываемся от ряда других характеристик, которые, на самом деле, даже важнее, чем частотность, — это связи между словами.

Кажется, что это касается не только текста, но и многих других объектов реальности: связи между элементами системы важнее количества этих элементов. Посмотрите на любой сложный механизм. Скажем, самолёт. Что лучше даст нам представление о том, как он устроен: список всех винтиков, панелей и шарниров с указанием, сколько раз каждый из них задействован в конструкциии, или точный чертёж, из которого будет ясно, акэти винтики и панели соединяются друг сдругом и соединяются в единую систему? Очевидно, что второе.

Модель, которая не только описывает элементы системы, но и фиксирует связи между ними, называется графом или сетью. В терминах графов может быть описана любая система, в которой можно выделить

  • элементы (в графе они называются узлами = вершинами = nodes = vertices)
  • связи между ними (они именуются рёбрами = связями = edges = relations).

Самый близкий нам пример — социальная сеть (не просто же так она сеть), где пользователи — узлы,а наличие «дружбы» между пользователями — ребро. Чуть менее очевидные графы, с которыми мы сталкиваемся каждый день — метро и интернет.

Зачем нужны графы?

Прежде всего, графы любят за то, что их можно визуализировать, и в результате получается красивая картинка. Действительно, визуальный анализ уже может дать довольно много, и рассматривание такой картинки в некотором смысле уже научная работа.

Но не только. Рассматриванием картинок дело не ограничивается. Граф — это математический объект, в котором мы можем довольно много всего посчитать, и таким образом установить разные закономерности, доказать гипотезу. Это называется сетевым анализом.

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

Мы можем пойти двумя путями, в зависимости от того, положения, в котором находимся. Первая ситуация: у нас есть какие-то данные, и нам нужно превратить их в граф. Тогда уместно создать сначала пустой объект графа и туда постепенно что-то добавлять.

Реализация Graph в Python

Реализуйте взвешенную и невзвешенную структуру данных ориентированного Graph в Python.

Directed Graph

В представлении Graph списком смежности каждая вершина Graph хранит список соседних вершин. Ниже приведено графическое представление соответствующего списка смежности для приведенного выше Graph:

Adjacency List

1. Реализация ориентированного Graph

Ниже приведена реализация Python ориентированного Graph с использованием списка смежности:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *