将igraph转换为visNetwork

5
我发现了一种将igraph转换为visNetwork的方法(参见使用arulesViz和visNetwork进行交互式arules)。假设在从igraph转换为visNetwork之前和之后,结果应该是相同的,但我的结果显示,在转换为visNetwork之后,结果不同。
我将尝试使用样本数据data("Groceries")来演示这个问题,数据来自Library(arules)
#Pre-defined library
library(arules)
library(arulesViz)
library(visNetwork)
library(igraph)

#Get sample data & get association rules
data("Groceries")
rules <- apriori(Groceries, parameter=list(support=0.01, confidence=0.4))
rules <- head(sort(rules, by="lift"), 10)

#Convert rules to data.table
library(data.table)
rules_dt <- data.table( lhs = labels( lhs(rules) ), 
                        rhs = labels( rhs(rules) ), 
                        quality(rules) )[ order(-lift), ]

打印所有规则,以表格格式排序(按提升度)。

enter image description here

使用igraph绘制前10个关联规则的图表

ig <- plot(rules, method="graph", control=list(type="items"))

enter image description here

注意:基于关联规则,我使用igraph绘制了一个网络图,一切都正确。接下来,我将尝试将现有的igraph转换为visNetwork,然后我们比较结果。
tf <- tempfile( )
saveAsGraph(rules, file = tf, format = "dot" )
# clean up temp file if desired
#unlink(tf)

# Convert igraph to dataframe
ig_df <- as_data_frame(ig, what = "both")

# Plot visNetwork
visNetwork(
  nodes = data.frame(
     id = ig_df$vertices$name
 ,value = ig_df$vertices$lift # could change to lift or confidence
 ,title = ifelse(ig_df$vertices$label == "",ig_df$vertices$name, 
 ig_df$vertices$label)
 ,ig_df$vertices
 ), 
edges = ig_df$edges
) %>%
visEdges(arrows ="to") %>%  
visOptions( highlightNearest = T )

使用visNetwork绘制前10个关联规则的图表。 enter image description here 注意:对于visNetwork图表,拦截节点的大小表示“提升度”,提升度越高,拦截节点越大;与igraph图表不同,拦截节点的大小表示“支持度”,而拦截节点的颜色表示“提升度”。
让我们比较igraph和visNetwork。 enter image description here 通过参考表格格式中的关联规则,规则编号10(具有最小“提升度”的规则)假设拦截节点的大小最小,但最终其并非最小。
问题。

我试图进一步深入研究 ig_df <- get.data.frame( ig, what = "both" ),并发现在从 library(igraph) 中的 as_data_frame 函数生成的 ig_df$vertices 表格中有一些奇怪的东西。enter image description here 我发现关联规则编号10的截距节点assoc10实际上对于所有变量(即“support”、“confidence”、“lift”和“count”)都有 NA,更准确地说,在 ig_df$vertices 中,“support”、“confidence”、“lift”和“count”列的维度向上移动了一行!如果我错了,请纠正我。

结论 将igraph转换为visNetwork的关键是使用as_data_frame从igraph中提取所有数据并将这些数据转换为数据帧,然后使用从提取的数据框绘制visNetwork。但是由于在使用as_data_frame从igraph中提取数据时存在提取问题,因此结果也会有所不同。

问题:这是一个错误吗?还是我在代码上犯了错误?欢迎任何建议。谢谢!


1
我无法重现这个问题,是否有一些代码丢失了?我的“rules”对象中的值也与所示的不同。 - Esther
嗨@Esther,感谢回复,是我的错误。我已将support = 0.001更改为support = 0.01,将confidence = 0.5更改为confidence = 0.4。现在rules应该与所示相同 :) - yc.koong
这真的很酷!我会收藏这个! - stats_noob
1个回答

1
一年后...但我已经输入了所有内容,所以也许应该继续。

如果我理解正确,这是你困扰的根源 -

value = ig_df$vertices$lift # 可以更改为lift或confidence

最简单的解决方案是将你的提升值分配给size,因为在visNetwork中size: Number。默认为25。大小用于确定没有标签的节点形状的大小。这些形状是:image、circularImage、diamond、dot、star、triangle、triangleDown、square和icon。我不确定values在这里是如何工作的,但我认为如果你也提供适当的scaling,你可以使用values

https://www.rdocumentation.org/packages/visNetwork/versions/2.0.9/topics/visNodes

所以解决方案是:

size = ig_df$vertices$lift # 可以更改为lift或confidence

请注意,具有NA提升的节点默认设置为大小25,并且使用大小2或3提升几乎看不到节点。您可以指数级增加提升大小,这将增加节点的大小并夸大提升差异。
ig_df <- as_data_frame(ig, what = "both")
ig_df$vertices["lift"] <- ig_df$vertices["lift"] ** 3

我无法重现你的表格问题,我的看起来很好,希望它能自行解决!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接