gpt4 book ai didi

r 将 igraph 转换为 visNetwork

转载 作者:行者123 更新时间:2023-12-02 04:26:15 24 4
gpt4 key购买 nike

我找到了一种将 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com