我找到了一种将 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), ]
以表格格式打印所有规则(按提升排序)
通过使用 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图,拦截节点的大小用“lift”表示,lift越高,拦截节点的大小越大;与 igraph 图不同,截取节点的大小表示“支持”,而截取节点的颜色表示“提升”。
让我们比较 igraph 和 visNetwork
引用表格形式的关联规则,第10条规则(“提升”最小的规则),假设截取节点的大小最小,但最终它不是最小的。
问题
我试图进一步深入到
ig_df <- get.data.frame( ig, what = "both" )
,我在 ig_df$vertices
上发现了一些奇怪的东西表,从 as_data_frame
生成函数来自 library(igraph)
.我发现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/