Пакеты, работающие с networkx, которые могут обрабатывать интерактивные узлы

#python #events #click #networkx #pyvis

#python #Мероприятия #нажмите #networkx #pyvis

Вопрос:

Я хочу попытаться визуализировать данные, используя networkx в качестве сетевого графика. Мои данные выглядят великолепно, но я хочу добавить события при наведении курсора мыши и при нажатии для отображения дополнительной информации. Например, может быть узел с именем «Нью-Йорк», при нажатии на который будет отображаться небольшая таблица сбоку от холста, в которой содержится информация о том, сколько городов, текущее население и т. Д. В настоящее время я использую pyviz с networkx. Это кажется действительно простым в плане создания графика, но не столько в отношении того взаимодействия с пользователем, которое я ищу.

Я также пробовал bokeh и plotly, но функции on click и hover во время работы не очень просто реализовать с networkx. Вот изображение того, как выглядит мой график. Моя цель — показать взаимосвязи между системами.

график pyvis

Комментарии:

1. networkx имеет вывод в graphviz , который может поддерживать некоторые элементы html, такие как title. из graphviz вы можете выводить svg.

Ответ №1:

Я поддерживаю библиотеку python для визуализации сети под названием netgraph, которая прекрасно работает с объектами networkx или igraph Graph . Я подумал, что это отличная идея для функции, поэтому я просто внедрил версию с голыми костями в dev ветке.

демонстрационный gif

Установка через pip:

 pip install https://github.com/paulbrodersen/netgraph/archive/dev.zip
 

Код для воспроизведения приведенного выше примера:

 import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import networkx as nx

from netgraph import InteractiveGraph

g = nx.cubical_graph()

tables = dict()
for node in g.nodes:
    data = np.round(np.random.rand(3,2), decimals=2)
    table = pd.DataFrame(data, index=['Lorem', 'ipsum', 'dolor'], columns=['sit', 'amet'])
    tables[node] = table

for edge in g.edges:
    data = np.round(np.random.rand(4,1), decimals=2)
    table = pd.DataFrame(data, index=['consectetur', 'adipiscing', 'elit', 'Mauris'], columns=['sed'])
    tables[edge] = table

fig, ax = plt.subplots(figsize=(12,5))
fig.subplots_adjust(right=0.6) # make space for table on the right
bbox = [1.5, 0.1, 0.5, 0.8] # position of the table in axes coordinates
instance = InteractiveGraph(g, node_labels=True, tables=tables, table_kwargs=dict(edges='horizontal', fontsize=16, bbox=bbox), ax=ax)
plt.show()
 

Комментарии:

1. Это действительно здорово! Есть ли у него функция фильтрации? Например, если я введу «новый» в текстовое поле, будут отображаться такие узлы, как «Нью-Йорк, Нью-Джерси, Нью-Мексико и т. Д.»

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

3. Где это предназначено для запуска? Я попробовал это в записной книжке Jupyter, и он отображается, но не является интерактивным.

4. @autonopy Вы использовали интерактивный серверный сервер jupyter, например, с %matplotlib notebook ?

5. @PaulBrodersen — нет, у меня не было, но это работает. Спасибо!

Ответ №2:

Взгляните на kglab проект, который представляет собой уровень абстракции с открытым исходным кодом на Python, который объединяет оба NetworkX и PyVis , наряду с другими библиотеками, связанными с графами, на Python. Он был создан для такого варианта использования.

Существует класс kglab.KnowledgeGraph , который имеет преобразования и обратные преобразования для работы с этими другими библиотеками:

Например, вы могли бы:

  1. построение графика с использованием KnowledgeGraph объекта
  2. преобразование для запуска NetworkX алгоритмов графа
  3. используйте обратное преобразование для заполнения вычисляемых атрибутов в главном объекте graph
  4. преобразование для загрузки и запуска PyVis интерактивного сеанса, который, в свою очередь, может иметь интерактивные компоненты

У нас есть записные книжки Jupyter в репозитории GH, показывающие каждый из этих шагов. плюс сообщество разработчиков, где другие люди могут помочь в конкретном случае использования (создать проблему GH)

Комментарии:

1. Привет, Пако, спасибо за ответ. Использует ли он интерактивные функции, предоставляемые PyViz? Потому что PyVis не имеет интерактивной функциональности, которую я ищу. Я могу щелкать и перетаскивать узлы, а также изменять форму узла, длину ребра и т. Д… но это не то, что мне нужно. Мне нужно иметь возможность щелкнуть по узлу и загрузить боковое окно с информацией об этом узле. Если это может заставить это работать, я полностью за это. Но, насколько я могу судить, с pyvis действительно сложно работать, чтобы добиться таких результатов.

2. Я понимаю, что вы имеете в виду. С одной стороны, мы предоставляем уровень абстракции Python, чтобы графики NetworkX и графики RDFLib можно было интегрировать с другими библиотеками графов, поэтому PyVis — это всего лишь один экземпляр, и, вероятно, есть другие, с которыми проще управлять onClick обработчиками в пользовательском интерфейсе

3. С другой стороны, большинство этих библиотек визуализации графиков — это JavaScript под капотом, и для добавления обработчика требуется всего несколько строк кода onClick . В PyVis есть экспериментальная ветка, работающая в этом направлении, и другие разработчики создали свои собственные github.com/WestHealth/pyvis/pull/91/files