2017-02-10 58 views
1

我一直在尝试使用plotly R库创建网络图。我想要想象一个自定义的hoverinfo文本,其文本标记与为标记(或本例中的节点)定义的文本标记不同。在与“文本”参数不同的标准R表上定制hoverinfo文本?

基本上,我想保留标记(节点)上的文本标签,因为它们是当前的,但也能够为hoverinfo提供自定义文本。 正如我希望工具提示显示与标记的标签文本不同的其他字符矢量。例如,当我徘徊在中央的“宫本茂”节点时,我想用工具提示来展示我可能收集的其他信息(例如类型,国籍等)。我从剧情介绍中了解到,目前你只能为标记和hoverinfo工具提示显示相同的文本标签。

有没有办法做到这一点?

这是我使用的代码:

library(plotly) 
library(igraph) 
library(dplyr) 

A <- data.frame(A=rep("Shigeru Miyamoto",10)) 

B <- data.frame(B=c("Ninendo Company Ltd","Super Mario Bros","Mario", "Gamespot","Time Magazine","Wii","DOnkey Kong Jr","Mario Kart","Japan","Mario Party")) 

edgelist <- bind_cols(A,B) 

graph <- graph_from_data_frame(edgelist) 
L <- layout_nicely(graph) 
vs <- V(graph) 
es <- as.data.frame(get.edgelist(graph)) 
Ne <- length(es[1]$V1) 
Xn <- L[,1] 
Yn <- L[,2] 

txt <- list(
     family = "calibri", 
     size = 15, 
     color = "white", 
     opacity = 1 
) 

size = c(20,rep(5,length(vs)-1)) 


network <- plot_ly(type = "scatter", x = Xn, y = Yn, mode = "markers+text", 
        text = names(vs), hoverinfo = "text",marker=list(size=size,color='5BC0DE'), textfont = txt 

) 


edge_shapes <- list() 
for(i in 1:Ne) { 
     v0 <- es[i,]$V1 
     v1 <- es[i,]$V2 

     edge_shape = list(
       type = "line", 
       line = list(color = "DF691A", width = 1), 
       x0 = Xn[match(v0,names(vs))], 
       y0 = Yn[match(v0,names(vs))], 
       x1 = Xn[match(v1,names(vs))], 
       y1 = Yn[match(v1,names(vs))], 
       opacity = 0.3 
     ) 

     edge_shapes[[i]] <- edge_shape} 

network <- layout(
     network, 
     paper_bgcolor="#4e5d6c", 
     plot_bgcolor="#4e5d6c", 
     hovermode = "closest", 
     title = paste("Miyamoto's Relations",sep = ""), 
     titlefont=list(color="white"), 
     shapes = edge_shapes, 
     xaxis = list(title = "", showgrid = FALSE, showticklabels = FALSE, zeroline = FALSE), 
     yaxis = list(title = "", showgrid = FALSE, showticklabels = FALSE, zeroline = FALSE) 


) 


network 

Graph

+0

它更容易帮助你,如果你包括[最小,可重复的例子(http://stackoverflow.com/questions/5963269/how-to-make-a-great-r - 可重复使用的示例),包含示例输入数据和您当前使用的代码。 – MrFlick

+0

感谢您的建议@MrFlick,我添加了代码。 –

+0

当你说:为hoverinfo提供自定义文本 – MLavoie

回答

3

经进一步研究,我想我找到了一个潜在的解决方案通过使用annotations .The想法是从markers隐藏文本,而使用annotations为节点标签。这样,您可以包含hoverinfo工具提示文本的任意字符向量。

hover_text <- rep('Game Designer/Mario Creator',11) 

size = c(100,rep(40,length(vs)-1)) 


network <- plot_ly(type = "scatter", x = Xn, y = Yn, mode = "markers", 
        text = hover_text, hoverinfo = "text",marker=list(size=size,color='5BC0DE') 

) 

edge_shapes <- list() 
for(i in 1:Ne) { 
     v0 <- es[i,]$V1 
     v1 <- es[i,]$V2 

     edge_shape = list(
       type = "line", 
       line = list(color = "DF691A", width = 1), 
       x0 = Xn[match(v0,names(vs))], 
       y0 = Yn[match(v0,names(vs))], 
       x1 = Xn[match(v1,names(vs))], 
       y1 = Yn[match(v1,names(vs))], 
       opacity = 0.3 
     ) 

     edge_shapes[[i]] <- edge_shape} 

network <- layout(
     network, 
     paper_bgcolor="#4e5d6c", 
     plot_bgcolor="#4e5d6c", 
     hovermode = "closest", 
     title = paste("Miyamoto's Relations",sep = ""), 
     titlefont=list(color="white"), 
     shapes = edge_shapes, 
     xaxis = list(title = "", showgrid = FALSE, showticklabels = FALSE, zeroline = FALSE), 
     yaxis = list(title = "", showgrid = FALSE, showticklabels = FALSE, zeroline = FALSE), 
     annotations=list(x = Xn, 
       y = Yn, 
       text = names(vs), 
       xref = "x", 
       yref = "y", 
       showarrow = F, 
       font=list(family = "calibri", 
          size = 15, 
          color = "white", 
          opacity = 1)) 
     ) 


network 

enter image description here