Наука о данных

Настройка графиков NetworkX

Ваш универсальный магазин для всех вещей NetworkX

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

Я использовал NetworkX, пакет Python для построения графиков, который имеет в основном используемые значения по умолчанию, но использование matplotlib позволяет нам настраивать почти все мыслимые аспекты графика. Я знал, как я хочу, чтобы это выглядело в моей голове, но после многих часов поиска в документации и StackOverflow я решил создать этот универсальный магазин для всех вещей, которые я научился менять! Теперь вы тоже можете строить удобочитаемые графики, помогающие визуализировать сложные отношения.

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

Начнем с построения простого графика! Есть несколько способов сделать это. Я обнаружил, что самый простой способ сделать это - использовать фрейм данных pandas, где вы указываете края. Что за преимущество? Что ж, графы строятся с использованием узлов и ребер. Узел представляет некоторый объект, возможно, человека или организацию, а ребро представляет фактическое соединение от одного узла к другому. Итак, в приведенном ниже примере «A», «B», «C» и «D» - это узлы, а линии между ними - это края.

Цвет узла

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

Цвет узла по типу узла

Но предположим, что мы хотим изменить цвет узлов конкретно по типу, а не глобально. Это требует небольшой настройки, но после того, как все будет готово, мы сможем быстро добавить новые типы и автоматически раскрасить их соответствующим образом. По сути, мы создаем еще один DataFrame, в котором указываем идентификатор узла и тип узла и используем метод pd.Categorical () для применения цветовой карты.

Итак, теперь наши буквенные узлы окрашены в синий цвет, а наши числовые узлы - в оранжевый!

Размер узла

Изменить размер узла глобально, опять же, довольно просто с помощью аргумента ключевого слова в методе .draw () - просто укажите node_size!

Размер узла по типу узла

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

Таким образом, мы будем строить из нашего примера цвета узла по типу, но вместо одного аргумента ключевого слова для node_size мы передадим список размеров узла, ссылающийся на тип узла, используемый для выбора цвета узла.

Вот логика понимания списка, если кто-то борется:

Для каждого узла в DataFrame установите размер узла на 4000, если тип этого узла не «Letter», в противном случае установите размер узла на 1000. В результате все, что не является буквой, будет узлом большего размера. При наличии только двух типов узлов на данный момент это может быть излишним, но позже он будет лучше масштабироваться.

node_sizes = [4000 if entry != 'Letter' else 1000 for entry in carac.type]

Размер узла вручную

Если нам не нужно изменять размер узла по типу, а просто нужно привлечь внимание к конкретным узлам, мы можем вручную указать список размеров. Они должны быть в том же порядке, в котором хранятся узлы, поэтому вызовите G.nodes (), чтобы сгенерировать список, которому нужно следовать. Некоторые типичные размеры указаны ниже, чтобы вы могли понять их относительный размер. Я считаю, что 5000 - это хорошая золотая середина, где можно удобно разместить имя и фамилию.

Ширина края

Теперь, когда мы рассмотрели атрибуты узлов, мы можем перейти к краям. Установить глобальный размер или цвет кромки так же просто, как и для узлов, просто укажите ключевое слово width в методе .draw ().

Цвет края

Края могут быть окрашены или заданы индивидуально, а не глобально, путем передачи списков атрибутов вместо отдельных значений. Итак, ниже у нас есть edge_colors и edge_widths, которые будут циклически проходить.

Цвет границы узла

Наконец, мы также можем добавить к узлам цветную границу с помощью сбивающего с толку ключевого слова «edgecolors», которое не то же самое, что «edge_color». Это можно использовать, чтобы прояснить и разделить узлы, что вы можете увидеть на приведенном ниже примере графика.

Макет графика

Один из самых важных аспектов графика - это то, как он устроен! Это в конечном итоге определит удобочитаемость и полезность графика. В NetworkX есть множество опций для определения макета, из которых я расскажу о самых популярных 4 ниже. По умолчанию используется spring_layout, который используется во всех вышеупомянутых случаях, но другие имеют свои достоинства в зависимости от вашего варианта использования. Я рекомендую попробовать несколько, чтобы увидеть, что работает лучше всего.

Здесь вы можете ознакомиться с макетной документацией.

Пример сети - связываем вместе

Итак, вот полностью реализованный пример из моего проекта, описанного выше. Я составил карту взаимоотношений выдающихся профессиональных дизайнеров освещения с некоторыми выдающимися университетами и организациями в мире театрального дизайна. Цель - определить, как личные связи влияют на сплоченный мир театральных дизайнеров.

Вы заметите, что сам текст тоже можно изменить. Код приведен ниже, но вы можете использовать такие ключевые слова, как font_size и font_weight. Кроме того, символы новой строки «\ n» допускаются в заголовках узлов и часто улучшают читаемость. Например, узел для Джона Глисона указан как «Джон \ nГлисон» в DataFrame.

Заключение

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

Соединять

Я всегда ищу возможности познакомиться и изучить другие проекты! Вы можете подписаться на меня на GitHub или LinkedIn, а другие мои истории - на Medium. Еще у меня есть Твиттер!