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.

visNetwork visOptions No Resalta el Borde Deseado utilizando highlightNearest en un Gráfico No Dirigido

Tengo un grafo no dirigido y me gustaría resaltar todos los bordes relevantes (hacia y desde un nodo en particular) cuando haga clic en un nodo.

library(visNetwork)

nodes = data.frame( id = 1:2 , label = paste('Etiqueta', 1:2) )
edges = data.frame( from = 1 , to = 2 )

visNetwork( nodes , edges ) %>%
    visOptions( highlightNearest = list( enabled = TRUE , degree = 0 ) )

El código anterior funciona perfectamente cuando hago clic en el nodo 1:

El borde está resaltado.

Sin embargo, ningún borde se resalta cuando hago clic en el nodo 2:

El borde permanece sin resaltar.

Esto se debe obviamente a que highlightNearest solo resalta los bordes “desde” un nodo seleccionado. ¿Hay alguna opción para cambiar este comportamiento de modo que highlightNearest asuma un grafo no dirigido?

Sospecho que mi pregunta puede ser lo que el autor de esta publicación de SO estaba insinuando. Sin embargo, creo que mi pregunta es más precisa, en mi humilde opinión.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, parece que actualmente no hay una opción incorporada en visNetwork para hacer que highlightNearest asuma un grafo no dirigido al resaltar los bordes. Una posible solución es especificar manualmente todos los bordes relevantes que se deben resaltar para cada nodo utilizando una función observe:

    library(shiny)
    library(visNetwork)
    
    nodes = data.frame(id = 1:5, label = paste('Label', 1:5))
    edges = data.frame(from = c(1,2,2,3,4,4), to = c(2,1,3,2,5,4))
    
    highlight_edges <- function(selected_node_id, nodes, edges) {
      selected_edges <- edges %>% filter(from == selected_node_id | to == selected_node_id)
      adjacent_nodes <- unique(c(selected_edges$from, selected_edges$to))
      adjacent_edges <- edges %>% filter(from %in% adjacent_nodes & to %in% adjacent_nodes)
      highlight_edges <- adjacent_edges %>% filter(from == selected_node_id | to == selected_node_id)
      return(highlight_edges)
    }
    
    ui <- fluidPage(
      visNetworkOutput('network')
    )
    
    server <- function(input, output, session) {
      output$network <- renderVisNetwork({
        visNetwork(nodes, edges) %>% 
          visOptions(highlightNearest = list(enabled = FALSE)) # desactivar comportamiento de resaltado predeterminado
      })
    
      observe({
        event_data <- event_data('click') # observar clics en los nodos
        if (!is.null(event_data)) {
          selected_node_id <- event_data$id
          highlight_edges <- highlight_edges(selected_node_id, nodes, edges)
          visNetworkProxy('network') %>%
            visEdges(highlight_edges$id) %>% # resaltar bordes relevantes
            visEdges(colors = list(color = 'red')) # cambiar color de los bordes resaltados
        }
      })
    }
    
    shinyApp(ui, server)
    

    En esta solución, la función highlight_edges se utiliza para determinar todos los bordes que son relevantes para un nodo seleccionado (es decir, los bordes conectados al nodo seleccionado o a otros nodos que también están conectados al nodo seleccionado). La función observe observa los clics en los nodos y utiliza highlight_edges para determinar qué bordes resaltar utilizando visEdges.

    Nota: Esta solución puede no ser óptima para grafos grandes, ya que implica filtrar el marco de datos de los bordes para cada nodo seleccionado. Sin embargo, debería funcionar bien para grafos más pequeños.

Comments are closed.