es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Paquetes que funcionen con networkx y que puedan manejar nodos con funcionalidad de clic.

Estoy buscando visualizar datos utilizando networkx como un grafo de red. Mis datos se ven bien, pero quiero agregar eventos de “hover” y “on click” para mostrar información adicional.
Por ejemplo, puede haber un nodo llamado “Nueva York” que, al hacer clic, muestre una pequeña tabla al lado del lienzo que brinda información como la cantidad de ciudades, la población actual, etc.
Actualmente estoy utilizando pyviz con networkx. Eso parece ser muy sencillo en cuanto a la creación del gráfico, pero no tanto en cuanto a la interacción con el usuario que estoy buscando.

También intenté con bokeh y plotly, pero las funciones “on click” y “hover” no son muy claras de implementar con networkx. Aquí hay una imagen de cómo se ve mi grafo. Mi objetivo es mostrar las relaciones entre los sistemas.

Imagen del grafo de pyvis

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para agregar eventos de hover y click para mostrar información adicional en un gráfico de red creado con networkx, puedes usar la biblioteca pyvis. Sin embargo, pyvis solo puede no proporcionar el nivel requerido de interacción con el usuario. Puedes combinarlo con Bokeh o Plotly para lograr la interacción deseada.

    Para habilitar los eventos de hover y click, puedes usar los métodos set_on_click_node y set_on_hover_node de la clase pyvis.network.Network. Puedes definir una función personalizada para cada evento que active alguna acción o muestre información adicional.

    Por ejemplo, para crear una tabla que muestre información sobre una ciudad cuando se hace clic en el nodo correspondiente, puedes definir una función que reciba el nombre de la ciudad como entrada y devuelva la información requerida en formato HTML. Luego puedes pasar esta función como parámetro al método set_on_click_node:

    from pyvis.network import Network
    import networkx as nx
    
    def obtener_informacion_ciudad(nombre_ciudad):
        # obtener y formatear datos para la ciudad
        return "<h2>{}</h2><table><tr><td>Población:</td><td>...</td></tr><tr><td>Ciudades:</td><td>...</td></tr></table>"
    
    # crear el gráfico de red utilizando networkx
    G = nx.Graph()
    # agregar nodos y conexiones a G
    
    # crear el objeto Network de pyvis
    net = Network()
    net.from_nx(G)
    
    # definir la función del evento click
    def mostrar_informacion_ciudad(id_nodo):
        nombre_ciudad = net.get_node_atlas()[id_nodo]['title']
        info_html = obtener_informacion_ciudad(nombre_ciudad)
        net.show_buttons(filter_=['physics'])
        net.set_options('''
        var items = document.getElementsByClassName("vis-network-popover");
        while(items.length > 0){
          items[0].parentNode.removeChild(items[0]);
        }
        ''')
        net.show_popup(id_nodo, info_html)
    
    # asignar el manejador del evento click a todos los nodos
    for id_nodo in net.get_nodes():
        net.set_on_click_node(id_nodo, mostrar_informacion_ciudad)
    
    # mostrar el gráfico de red
    net.show("mygraph.html")
    

    En este ejemplo, la función obtener_informacion_ciudad recibe el nombre de una ciudad como entrada y devuelve una cadena formateada en HTML que muestra datos de población y ciudades. La función mostrar_informacion_ciudad es el manejador de eventos que extrae el nombre de la ciudad del título del nodo clicado y llama a la función obtener_informacion_ciudad para obtener la información adicional, y finalmente muestra un popup junto al nodo clicado que muestra esta información.

    De manera similar, puedes definir el método set_on_hover_node para mostrar información previa cuando el mouse se desplace sobre un nodo.

    En resumen, puedes utilizar la biblioteca pyvis para crear un gráfico de red y utilizar Bokeh o Plotly para agregar eventos de clic y hover que muestren información adicional.

Comments are closed.