将其他信息添加到“ visNetwork”

问题描述

使用R,我创建了有关一组人及其相互关系的虚假数据:

#relationship data

Data_I_Have <- data.frame(
   
    "Node_A" = c("John","John","Peter","Tim","Kevin","Adam","Xavier"),"Node_B" = c("Claude","Claude","Henry","Claude")," Place_Where_They_Met" = c("Chicago","Boston","Seattle","Paris","Chicago","London","Paris"),"Years_They_Have_KNown_Each_Other" = c("10","10","1","5","2","8","7","3","5"),"What_They_Have_In_Common" = c("Sports","Movies","Computers","Video Games","Sports","Video Games")
)

#data about individuals

additional_data_about_people <- data.frame(
   
    "Person" = c("John","Xacier","Henry"),"Job" = c("Teacher","Lawyer","Accountant","Engineer","Teacher","Lawyer"),"Age" = c("50","51","61","56","65","54","50"),"Favorite_Food" = c("pizza","pizza","tacos","ice cream","sushi","pizza")
)

使用此信息,我能够成功地建立一个表示这些人之间关系的图形网络:

library(igraph)
library(dplyr)
library(visNetwork)


graph_file <- data.frame(Data_I_Have$Node_A,Data_I_Have$Node_B)


colnames(graph_file) <- c("Data_I_Have$Node_A","Data_I_Have$Node_B")

graph <- graph.data.frame(graph_file,directed=F)
graph <- simplify(graph)

plot(graph)

nodes <- data.frame(id = V(graph)$name,title = V(graph)$name)
nodes <- nodes[order(nodes$id,decreasing = F),]
edges <- get.data.frame(graph,what="edges")[1:2]

visNetwork(nodes,edges) %>%   visIgraphLayout(layout = "layout_with_fr") %>%
    visOptions(highlightNearest = TRUE,nodesIdSelection = TRUE)

我认为,如果我可以在用户单击节点时显示有关每个人的信息以及他们之间的关系的详细信息(如果可能),将会很有用。

我尝试在R中使用“ visEvents”和“ title”选项(https://datastorm-open.github.io/visNetwork/nodes.html),但似乎无法弄清楚。有人可以告诉我该怎么做吗?

谢谢

解决方法

Data_I_Have <- data.frame(

  "Node_A" = c("John","John","Peter","Tim","Kevin","Adam","Xavier"),"Node_B" = c("Claude","Claude","Henry","Claude"),"Place_Where_They_Met" = c("Chicago","Boston","Seattle","Paris","Chicago","London","Paris"),"Years_They_Have_Known_Each_Other" = c("10","10","1","5","2","8","7","3","5"),"What_They_Have_In_Common" = c("Sports","Movies","Computers","Video Games","Sports","Video Games")
)

common_data = purrr::imap_dfc(dplyr::select(Data_I_Have,-Node_A,-Node_B),function(item,id){
  paste(id,"&colon; ",item)
})

common_strings = purrr::map_chr(seq(1,nrow(common_data)),function(in_row){
  paste(common_data[in_row,],collapse = "<br>")
})

edge_data = dplyr::transmute(Data_I_Have,from = Node_A,to = Node_B,title = common_strings)

#data about individualsli

additional_data_about_people <- data.frame(

  "Person" = c("John","Xacier","Henry"),"Job" = c("Teacher","Lawyer","Accountant","Engineer","Teacher","Lawyer"),"Age" = c("50","51","61","56","65","54","50"),"Favorite_Food" = c("pizza","pizza","tacos","ice cream","sushi","pizza")
)


library(igraph)
library(dplyr)
library(visNetwork)


graph_file <- data.frame(Data_I_Have$Node_A,Data_I_Have$Node_B)


colnames(graph_file) <- c("Data_I_Have$Node_A","Data_I_Have$Node_B")

graph <- graph.data.frame(graph_file,directed=F)
graph <- simplify(graph)

plot(graph)

add_field = purrr::imap_dfc(additional_data_about_people,id){
  paste0(id,item)
})
additional_strings = purrr::map_chr(seq(1,nrow(add_field)),function(in_row){
  paste(add_field[in_row,collapse = "<br>")
})
additional_df = data.frame(id = additional_data_about_people$Person,title = additional_strings)
additional_df2 = dplyr::left_join(data.frame(id = V(graph)$name),additional_df,by = "id")


nodes <- data.frame(id = V(graph)$name,title = additional_df2$title)
nodes <- nodes[order(nodes$id,decreasing = F),]
edges <- get.data.frame(graph,what="edges")[1:2]

edges2 = dplyr::left_join(edges,edge_data,by = c("from","to"))


visNetwork(nodes,edges2)

然后在悬停时,我会看到有关每个节点和边缘的其他信息。

这里要注意两件事:

  1. visNetwork以html显示,因此您必须将html代码用于特殊字符,例如,<br>用于返回,&colon;用于“:”。
  2. 所有内容都可以具有“ title”属性,该属性会显示为工具提示,因此您也可以将其添加到边缘。

注意,我创建了data.frame,在其中添加了属性以使其成为 look 字段,例如“:”,然后将它们全部粘贴在一起以显示实际标题。 / p>

希望以上所述是合理的。

此外,修复代码,在一个变量名前面留一个空格,这将使它变得很奇怪。

就在单击名称时显示名称而言,此刻不在我范围内。