【问题标题】:How to create a network graph with DiagrammeR?如何使用 DiagrammeR 创建网络图?
【发布时间】:2017-11-28 17:10:51
【问题描述】:

我有一个大型数据集,但让我们举一个玩具示例:

mydata <- data.table(from=c("John", "John", "Jim"),to=c("John", "Jim", "Jack"))

nodesd=unique(c(mydata$from, mydata$to))
nodes <-   create_node_df(  n=length(nodesd), label=nodesd, type=nodesd)
edges <-   create_edge_df(from = mydata$from, to =  mydata$to,  rel = "leading_to")
graph <-   create_graph(  nodes_df = nodes,     edges_df = edges)
render_graph(graph)

但我明白了:

而不是预期的结果:

我使用第一个 igraph 得到了那个,但我想避免这一步。

更新:

library(data.table)
mydata <- data.table(from=c("John", "John", "Jim"),to=c("John", "Jim", "Jack"), stringsAsFactors = T)

mydata 已经在使用因子。我不需要额外的步骤转换因子。

我可以用 igraph 创建绘图:

library(igraph)
mygraph <- graph_from_data_frame(d=mydata, directed=T)
plot(mygraph)

或者使用它的对象来构建一个 DiagrammeR 图:

V(mygraph)$label = V(mygraph)$name
V(mygraph)$name = factor(V(mygraph)$name, levels=as.character(V(mygraph)$name))
mygraph2 <- from_igraph(mygraph)
render_graph(mygraph2)

但现在我尝试直接从 Diagrammer 执行此操作,而不使用 igraph:

nodesd = unique(unlist(mydata[,.(from,to)]))
nodes <-   create_node_df(  n=length(nodesd), label=nodesd)
edges <-   create_edge_df(from = mydata$from, to =  mydata$to,  rel = "leading_to")
graph <-   create_graph(  nodes_df = nodes, edges_df = edges)
render_graph(graph)

有什么问题?

【问题讨论】:

  • 和以前一样是性格和因素的问题。使用mydata[] &lt;- lapply(mydata, factor, levels=nodesd) 然后你的代码运行
  • 好的,虽然没有标签,只有数字
  • 标签为我正确呈现。按照这个顺序。 nodesd = ...,然后是 mydata[] &lt;- lapply...,然后是其余代码
  • @user20650 我已经用一个新问题更新了帖子。
  • 如果您查看levels(mydata$from) 和levels(mydata$to),您会看到不同的级别,因此名称将映射到不同的整数——因此出现了意想不到的图表。解决方案是在from 和to 中设置公因子水平,就像我的第一条评论一样。

标签: r plot graph diagrammer


【解决方案1】:

我得到了你的第一个代码:

> mydata <- data.table(from=c("John", "John", "Jim"),to=c("John", "Jim", "Jack"))
> nodesd=unique(c(mydata$from, mydata$to))
> nodes <-   create_node_df(  n=length(nodesd), label=nodesd, type=nodesd)
> edges <-   create_edge_df(from = mydata$from, to =  mydata$to,  rel = "leading_to")
Warning messages:
1: In create_edge_df(from = mydata$from, to = mydata$to, rel = "leading_to") :
  NAs introduced by coercion
2: In create_edge_df(from = mydata$from, to = mydata$to, rel = "leading_to") :
  NAs introduced by coercion
> graph <-   create_graph(  nodes_df = nodes,     edges_df = edges)
> render_graph(graph)

正如@user20650 所说,这是性格和因素的问题。所以我做出改变。

mydata <- data.frame(from=c("John", "John", "Jim"),
                     to=c("John", "Jim", "Jack"))
mydata$from <- as.character(mydata$from)
mydata$to <- as.character(mydata$to)
nodesd = unique(c(mydata$from, mydata$to))
nodes <- create_node_df(  n=length(nodesd), label=nodesd, type=nodesd)
edges <- create_edge_df(from = factor(mydata$from, levels = nodesd),
                        to =  factor(mydata$to, levels = nodesd),
                        rel = "leading_to")
graph <- create_graph(nodes_df = nodes, edges_df = edges)
render_graph(graph)

我得到了下面的结果。

结果:

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    相关资源
    最近更新 更多