Граф — это форма визуализации, позволяющая показывать и анализировать отношения между сущностями. Например, рисунок ниже показывает вклад редакторов Википедии на различных языках энциклопедии в июле 2013 года: 
Можно сделать несколько наблюдений: Я же расскажу о том, как для отображения графов использовать пакет 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. Начнем: Вы увидите что-то такое:  Вот другое изображение того же графа:  Само собой, граф без меток не очень полезен, если вообще полезен, поэтому давайте отрисуем метки: И теперь мы видим метку каждого узла:  Помните, что функция draw() каждый раз использует разные макеты? Так вот, для графа можно указать конкретный макет: Узлы упорядочены так, что по ним можно очертить круг:  Кроме того, график с круговой компоновкой можно нарисовать с помощью nx.draw_circular(), а не nx.draw(): Можно попробовать другие макеты: Ребра можно отметить при помощи nx.draw_networkx_edge_labels(). Фрагмент кода ниже размечает два ребра трех узлов:  Иногда полезно построить ориентированный граф. В нашем примере ребра могут представлять рейсы между двумя городами. Ориентированный граф позволяет увидеть, какие рейсы идут из одного города в другой. Следующий фрагмент кода показывает наш пример в виде ориентированного графа: Теперь вы видите, что есть рейсы из Сингапура в Сан-Франциско и наоборот; с другой стороны, есть рейсы из Риги в Сан-Франциско, но не наоборот:  По умолчанию узлы имеют синий цвет и довольно маленький размер. Настроить узлы и цвет ребра можно, передав словарь в функцию draw(): Сейчас узлы желтые и они больше, а ребра синие:  Если вы хотите обозначить узлы, вам нужно сделать это вручную, используя matplotlib. Следующий фрагмент кода задает размер рисунка 10 на 10 дюймов (ширина и высота), а затем функцией set_edgecolor() рисует контур каждого узла: Теперь каждый узел обведен черным:  Если не установить размер рисунка, граф будет выглядеть так:  Чтобы раскрасить каждый узел разными цветами, можно определить цветовую палитру, такую как в bokeh, и установить значение ключу словаря node_color, затем передав его в draw(): И теперь узлы графа раскрашены разными цветами:  Если захочется указать свой цвет, установите его вручную: Вот и все на сегодня. А на наших курсах — полезная теория и много практики:  Data Science и Machine Learning Python, веб-разработка Мобильная разработка Java и C# От основ — в глубину А также