5

我找到了一种将 igraph 转换为 visNetwork 的方法(请参阅Interactive arules with arulesViz 和 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), ]

以表格格式打印所有规则(按电梯排序)

在此处输入图像描述

通过使用 igraph 绘制前 10 条关联规则

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

在此处输入图像描述

注意:根据关联规则,我使用 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 条关联规则 在此处输入图像描述

注意:对于visNetwork图,拦截节点的大小表示“提升”,提升越高,拦截节点的大小越大;与 igraph 图不同,拦截节点的大小表示“支持”,而拦截节点的颜色表示“提升”。

让我们比较一下 igraph 和 visNetwork

在此处输入图像描述 参考表格形式的关联规则,第10条规则(“提升”最小的规则),假设截取节点的大小是最小的,但最终它不是最小的。

问题

我试图进一步深入研究,我在桌子ig_df <- get.data.frame( ig, what = "both" )上发现了一些奇怪的东西,它是从. 我发现 assoc10(第 10 号关联规则的拦截节点)实际上具有所有变量(即“支持”、“信心”、“提升”和“计数”),更准确地说是“支持”、“信心”,“提升”和“计数”在上升一排!如果我错了请纠正我..ig_df$verticesas_data_framelibrary(igraph)在此处输入图像描述NAig_df$vertices

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

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

4

1 回答 1

0

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

如果我理解正确的话,这就是你的烦恼的根源——

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

而且我无法重现您的移位表问题,我的看起来很好,希望它能够自行解决!

于 2020-04-13T04:35:55.447 回答