NTA

О прекрасном: графовая аналитика в 3D

Порой Data Scientist’ам приходится иметь дело с графами. Чаще всего это дело не такое уж и сложное, но бывают разногласия, которые начинаются при представлении результатов заказчику данного графа, ведь у каждого своё представлении о прекрасном. Особенно, когда дело касается расположения узлов.

Сегодня мы снова сколлаборируем библиотеки NetworkX и Plotly (как уже было ранее ), а также научимся отрисовывать 3D графы для более комфортного взаимодействия с заказчиком, который сможет сам покрутить полученные результаты. Пожалуй, начнем.

Импортируем нужные нам библиотеки:

import networkx as nx import plotly.graph_objects as go

Не будем мудрить и за датасетом обратимся к официальной документации NetworkX, там находим данные, связанные с американским футболом, под названием «Football», благо документации у данной библиотеки на 700+ страниц. Там находим небольшое описание данных и код, который позволяет получить и отстроить граф в 2D. Для вашего удобства размещаю эту часть ниже:

import urllib.request import io import zipfile import matplotlib.pyplot as plt url = "http://www-personal.umich.edu/~mejn/netdata/football.zip" sock = urllib.request.urlopen(url) s = io.BytesIO(sock.read()) sock.close() zf = zipfile.ZipFile(s) txt = zf.read("football.txt").decode() gml = zf.read("football.gml").decode() gml = gml.split("\n")[1:]

Создадим граф с помощью полученных данных:

G = nx.parse_gml(gml)

Давайте посмотрим на данный граф в 2D, выставим цвет узла, его размер и толщину линии связи:

pos = nx.spring_layout(G, seed=1) options = { "node_color": "k", "node_size": 10, "width": .2,} nx.draw(G, pos, **options) plt.show();

Для создания графа в с тремя координатами установим размерность равную трем:

positionsNew = nx.spring_layout(G, dim = 3, seed = 1)

Посмотрим координаты для первой команды:

positionsNew['BrighamYoung'] array([ 0.14127402, -0.13225209, -0.0650812 ])

Сохраним координаты узлов x, y, z из набора координат positionsNew в отдельные списки, а в positionsEdges будем хранить все связи нашего графа, аналогично сделаем и для связей:

xNodes = [positionsNew[i][0] for i in list(positionsNew.keys())] yNodes = [positionsNew[i][1] for i in list(positionsNew.keys())] zNodes = [positionsNew[i][2] for i in list(positionsNew.keys())] positionsEdges = G.edges() xPosEdges = [] yPosEdges = [] zPosEdges = [] for posEdge in positionsEdges: xCoords = [positionsNew[posEdge[0]][0], positionsNew[posEdge[1]][0], None] xPosEdges.extend(xCoords) yCoords = [positionsNew[posEdge[0]][1], positionsNew[posEdge[1]][1], None] yPosEdges.extend(yCoords) zCoords = [positionsNew[posEdge[0]][2], positionsNew[posEdge[1]][2], None] zPosEdges.extend(zCoords)

Далее настроим сам график в plotly, начнем со связей в x, y, z передаем координаты, режим — линии, цвет черный:

plotly_edges = go.Scatter3d(x = xPosEdges, y = yPosEdges, z = zPosEdges, mode = 'lines', line = dict(color = 'black', width = 1) ,)

Аналогично с узлами, маркеры выберем неожиданно квадратные. Маркеров в документации оказалось слишком много на разный вкус:

plotly_nodes = go.Scatter3d(x = xNodes, y = yNodes, z = zNodes, mode = 'markers', marker = dict(symbol = 'square', size = 3, color = 'black', line = dict(color = 'black', width = .1)) ,)

Создадим небольшие настройки осей, отключим подписи и фон, оставим лишь ориентацию сторон — x, y, z. Подпишем наш граф и зададим ширину и высоту на выходе:

settings = {'showbackground': False, 'showticklabels': False} layout = go.Layout(title = "Test for NTA", width = 1600, height = 900, scene = {'xaxis': settings, 'yaxis': settings, 'zaxis': settings}, )

Ну и финальная часть, все объединяем и отрисовываем:

data = [plotly_edges, plotly_nodes] fig = go.Figure(data = data, layout = layout)
fig.show()

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

fig.write_html('figure.html')
0
0 комментариев
Популярные
По порядку
Читать все 0 комментариев
Банки Wall Street ожидают более агрессивных действий от ФРС

В США за последние 40 лет потребительская инфляция достигла угрожающих значений

Работа только для взрослых: чем занимается кавист и как им стать

Кавист — это специалист по вину и другим видам алкоголя, который работает в торговом зале. Он управляет поставками и размещением товара на полках, а еще консультирует покупателей: помогает выбрать лучшее. Мы решили рассказать о том, как устроена профессия и где учатся на кависта. А в конце — парочка полезных советов по выбору вина для всех…

Альфабанк. Звонки от фейковой "службы безопасности банка"

После оформления заявки на кредит на официальном сайте АльфаБанка, начали поступить звонки от мошенников

Образование, путешествия и благотворительность: на что тратились россияне в новогодние каникулы

Новогодние праздники — один из самых расточительных периодов года. Аналитики CloudPayments выяснили, какие категории товаров были самыми популярными в онлайне с 31 декабря по 9 января.

Как Counter Strike сделал меня веб-разработчиком и как я открыл свою веб-студию

Я, как и многие подростки, начинал свой путь с компьютерных игр, вернее с видеоигр, тогда еще компьютеры не были настолько популярными. Да, я про те времена, когда мы зависали, играя в приставку SEGA и у нас горели блоки питания от перегрева, кто в теме, тот поймет =)

15 трендов в иллюстрациях, которые дизайнеры могут использовать в 2022 году

Когда-то давно Магвай завоевал сердца заказчиков авторскими иллюстрациями. Время шло, наши приоритеты постепенно сместились в сторону UI/UX. Но сегодня нам захотелось вновь впечатлять пользователей и создавать эмоции с помощью графики. Мы изучили актуальные тренды и делимся переводом статьи про тенденции развития этой области дизайна в 2022 году.

Как мы запустили сервис цифрового тайного покупателя, забили на него на 3 года и вернулись к нему в локдаун

Всем привет! Меня зовут Михаил Кузьмин. Мне 35 лет, из которых 10 лет я занимался разными бизнесами: от франшиз Мосигры и Додо Пиццы до интегратора amoCRM и цифрового тайного покупателя Scont. По образованию я закончил МИФИ по специальности медицинская физика. По похожему направлению проработал 2.5 года в ФМБА и Росатоме. В итоге я разочаровался…

Люди на вырост: как it-компании получить новых сотрудников с нужными компетенциями

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

Креативные индустрии будут расти по плану

В РСПП обсудили проект Плана по реализации Концепции развития креативных индустрий, подготовленного Министерством культуры РФ с участием Комитета по интеллектуальной собственности и креативным индустриям и Федерации креативных индустрий.

Российские акции на Мосбирже упали на 6,5%: такого падения за день не было с начала пандемии, больше всех задело банки Статьи редакции

Индекс ещё упадёт, но затем будет «бурный отскок», считают эксперты.

null