r 将 igraph 转换为 visNetwork

标签 r igraph arules visnetwork

我找到了一种将 igraph 转换为 visNetwork 的方法(请参阅 Interactive arules with arulesViz and visNetwork )。假设从 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图,拦截节点的大小用“lift”表示,lift越高,拦截节点的大小越大;与 igraph 图不同,截取节点的大小表示“支持”,而截取节点的颜色表示“提升”。

让我们比较 igraph 和 visNetwork

enter image description here
引用表格形式的关联规则,第10条规则(“提升”最小的规则),假设截取节点的大小最小,但最终它不是最小的。

问题

我试图进一步深入到 ig_df <- get.data.frame( ig, what = "both" ) ,我在 ig_df$vertices 上发现了一些奇怪的东西表,从 as_data_frame 生成函数来自 library(igraph) .
enter image description here
我发现assoc10(10号关联规则的拦截节点)实际上有NA对于所有变量(即“支持”、“置信度”、“提升”和“计数”),更准确地说是 ig_df$vertices 中列“支持”、“置信度”、“提升”和“计数”的维度向上移动一排!如果我错了请纠正我..

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

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

最佳答案

一年后......但我已经输入了所有内容,所以也可以。

如果我理解正确,这就是你麻烦的根源——
value = ig_df$vertices$lift # could change to lift or confidence
最简单的解决方案是将您的提升值分配给 size因为在 visNetwork size: Number. Default to 25. The size is used to determine the size of node shapes that do not have the label inside of them. These shapes are: image, circularImage, diamond, dot, star, triangle, triangleDown, square and icon .我不确定如何 values在这里工作,但我认为你可以使用 values如果你也提供合适的scaling .
https://www.rdocumentation.org/packages/visNetwork/versions/2.0.9/topics/visNodes

所以解决办法是:
size = ig_df$vertices$lift # could change to lift or confidence
请注意,具有 NA 提升的节点默认设置为大小 25,而使用大小为 2 或 3 的提升您几乎看不到节点。您可以按指数方式提高提升大小,这将增加节点的大小并夸大提升的差异。

ig_df <- as_data_frame(ig, what = "both")
ig_df$vertices["lift"] <- ig_df$vertices["lift"] ** 3

而且我无法重现您的多变表问题,我的看起来不错,希望它可以自行解决!

关于r 将 igraph 转换为 visNetwork,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54328960/

相关文章:

python - 如何在igraph中查询与某个顶点相连的顶点?

r - R中的关联规则-删除冗余规则(规则)

r - 如何在列表中的多个数据框中绘制特定列?

r - 在 R 中的第二个函数中使用一个函数中的变量值

python - 3D 多面体在 2D 中的表示

r - 如何使用 igraph 包在 R 中进行求和

r - 根据父/子/兄弟关系从树中修剪/检索节点

r - 使用R中的arules包对重复交易进行关联分析

r - 如何将arules apriori输出转换为R中的数据帧

r - 如何根据 2 列的条件改变 R dplyr 中的新变量?