#python #events #click #networkx #pyvis
#python #Мероприятия #нажмите #networkx #pyvis
Вопрос:
Я хочу попытаться визуализировать данные, используя networkx в качестве сетевого графика. Мои данные выглядят великолепно, но я хочу добавить события при наведении курсора мыши и при нажатии для отображения дополнительной информации. Например, может быть узел с именем «Нью-Йорк», при нажатии на который будет отображаться небольшая таблица сбоку от холста, в которой содержится информация о том, сколько городов, текущее население и т. Д. В настоящее время я использую pyviz с networkx. Это кажется действительно простым в плане создания графика, но не столько в отношении того взаимодействия с пользователем, которое я ищу.
Я также пробовал bokeh и plotly, но функции on click и hover во время работы не очень просто реализовать с networkx. Вот изображение того, как выглядит мой график. Моя цель — показать взаимосвязи между системами.
Комментарии:
1. networkx имеет вывод в graphviz , который может поддерживать некоторые элементы html, такие как title. из graphviz вы можете выводить svg.
Ответ №1:
Я поддерживаю библиотеку python для визуализации сети под названием netgraph, которая прекрасно работает с объектами networkx или igraph Graph
. Я подумал, что это отличная идея для функции, поэтому я просто внедрил версию с голыми костями в dev
ветке.
Установка через 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
, который имеет преобразования и обратные преобразования для работы с этими другими библиотеками:
NetworkX
примеры https://derwen.ai/docs/kgl/ex6_0 /PyVis
примеры https://derwen.ai/docs/kgl/ex3_0 /
Например, вы могли бы:
- построение графика с использованием
KnowledgeGraph
объекта - преобразование для запуска
NetworkX
алгоритмов графа - используйте обратное преобразование для заполнения вычисляемых атрибутов в главном объекте graph
- преобразование для загрузки и запуска
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