Как создать сетевой график с DiagrammeR?

У меня большой набор данных, но давайте приведем пример с игрушкой:

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)

В чем проблема?

0 ответов

С вашим первым кодом я получил:

> 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)

Я получил результат ниже.

Результат:

ht tps://stackru.com/images/8874ba33a7eb921c154d0960c1dc3ae5e9f96820.png

Я надеюсь, что это может помочь.

Другие вопросы по тегам