Построение сети igraph с помощью DiagrammeR

Я хотел бы создать этот простой график igraph:

library(igraph)
mydata <- data.table(from=c("John", "John", "Jim"),to=c("John", "Jim", "Jack"))
mygraph <- graph_from_data_frame(d=mydata, directed=T)
plot(mygraph, vertex.label.dist=2)

введите здесь описание изображения

С диаграммой

library(DiagrammeR)
mygraph2 <- from_igraph(mygraph)
grViz(mygraph2)

Выдает эту ошибку

Ошибка в файле.существует (диаграмма): недопустимый аргумент «файл»

Я также пробовал с

grViz(readLines(mygraph2)) 

и другие комбинации или команду plot(), но я не могу найти правильный путь.

Как мне это сделать?

Я открыл новый вопрос, чтобы получить тот же результат напрямую с DiagrammeR, без igraph:

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


person skan    schedule 25.06.2017    source источник
comment
Вы хотите render_graph ?   -  person user20650    schedule 25.06.2017


Ответы (2)


Кажется, происходит несколько вещей.

library(igraph)
library(DiagrammeR)

mydata <- data.table(from=c("John", "John", "Jim"),to=c("John", "Jim", "Jack"))
mygraph <- graph_from_data_frame(d=mydata, directed=TRUE)

Следующий код выдает предупреждение

mygraph2 <- from_igraph(mygraph)

Предупреждающие сообщения: 1: В data.frame(from = as.integer(igraph::ends(igraph, igraph::E(igraph))[, : NA введены принудительно

И если вы посмотрите на mygraph2, там нет информации об узле или ребре, и он не отображает: render_graph(mygraph2). Но предупреждение является информативным, поскольку оно указывает на строки кода ( as.integer(ends(mygraph, E(mygraph), names=TRUE)) : может быть, мы хотим, чтобы имена = FALSE), поэтому попробуйте удалить имена, но установить метки.

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)

Если вы хотите увидеть код dot, вы можете использовать generate_dot , а затем передать его grViz, однако это то, что делает render_graph.

grViz(generate_dot(mygraph2))
person user20650    schedule 25.06.2017
comment
Лучше сделать так или попытаться создать график напрямую с помощью Diagrammer, без igraph? - person skan; 25.06.2017
comment
Мне нужно создать графики из больших наборов данных. Сначала я попробовал использовать igraph, потому что он автоматически размещает узлы в удобном месте. Это было то, что я прочитал в учебнике. Но я не знаю, какие преимущества или недостатки может иметь тот или иной метод. Хотя чем меньше пакетов я использую, тем лучше, возможно, мне не нужен шаг igraph. - person skan; 25.06.2017
comment
хорошо, если ваши графики большие, тогда будет полезно автоматически генерировать графики, а не вводить код графической визуализации (я не знал о generate_dot, поэтому я могу использовать это сам для создания исходного кода графической визуализации, который затем я могу изменить вручную) - person user20650; 25.06.2017
comment
Какой будет команда для создания графика непосредственно из моих данных (data.frame со столбцами от и до)? - person skan; 25.06.2017

В вашем процессе есть две проблемы.

Первый находится в команде from_igraph. Я не уверен, может быть, это ошибка в пакете, может быть, это проблема с моей настройкой, но я не мог использовать его для получения желаемого результата. На моей машине работает следующее.

mygraph3 <- from_adj_matrix(as.matrix(get.adjacency(mygraph)), mode = "directed")

И тогда вам нужно render_graph или что-то в этом роде, чтобы получить ваш график, grViz для строкового представления графика, а не для самого графика.

render_graph(mygraph3)
person Consistency    schedule 25.06.2017
comment
Если мы сравним результат вашего метода с методом user20650, ваш метод не выдает стрелок. - person skan; 25.06.2017
comment
установить mode="directed" в from_adj_matrix - person user20650; 25.06.2017
comment
@skan Я исправил эту ошибку в своем посте. Чтобы ориентированный граф был сгенерирован из смежной матрицы, аргумент mode должен быть установлен как направленный, и тогда он даст вам ориентированный граф. Спасибо, что указали на это. - person Consistency; 25.06.2017
comment
Какой будет команда для создания графика непосредственно из моих данных (data.frame со столбцами от и до)? - person skan; 25.06.2017
comment
Также было бы здорово добавить метки внутри узлов. - person skan; 25.06.2017
comment
@skan Кажется, что DiagrammeR не предоставляет функцию для преобразования data.frame в график. Поэтому, если вы хотите преобразовать data.frame в график DiagrammeR, единственный способ — через igraph. - person Consistency; 25.06.2017
comment
Я обновил свой вопрос своей пробной версией, чтобы получить график только с помощью DiagrammeR. - person skan; 25.06.2017