Как отсортировать дублированные значения в графике igraph в R?

#r #igraph

Вопрос:

Есть igraph заговор. Я хочу вручную отсортировать положение строк. введите описание изображения здесь

Например, на приведенном выше графике линия Tamiang должна располагаться во второй строке вверху, а линия Sigulai -> ОШИБКА ->> NA>> расположена в нижней части графика. Это данные:

 dput(sample)
structure(list(NMSUKU = c("Aceh/ Achin/ Akhir/ Asji/ A-Tse/ Ureung Aceh", 
"Alas", "Aneuk Jamee", "Gayo", "Gayo Lut", "Gayo Luwes", "Gayo Serbe Jadi", 
"Kluet", "Sigulai", "Simeulue", "Simeulue", "Simeulue", "Singkil", 
"Singkil", "Tamiang"), TopLang = c("Aceh/ Acheh/ Achi ", "Alas ", 
"Aceh Jamee ", "Gajo/ Gayo ", "Gajo/ Gayo ", "Gajo/ Gayo ", "Gajo/ Gayo ", 
"Aceh Kluet ", "ERROR  TopCol out of range ", "Long Bano/ Simalur/ Simeuloe/ Simeulue/ Simulul ", 
"Aceh Simeleu Barat ", "Aceh Simeleu Tengah ", "Aceh Hulu Singkil ", 
"Aceh Hulu Singkil ", "Tamiang "), Ethnicity = c("1_Aceh/ Achin/ Akhir/ Asji/ A-Tse/ Ureung Aceh  ", 
"2_Alas  ", "3_Aneuk Jamee  ", "4_Gayo  ", "6_Gayo Luwes  ", 
"5_Gayo Lut  ", "7_Gayo Serbe Jadi  ", "8_Kluet  ", "NA  ", "10_Simeulue  ", 
"10_Simeulue  ", "10_Simeulue  ", "11_Singkil  ", "17_Batak Pakpak Dairi  ", 
"12_Tamiang  ")), row.names = c(NA, -15L), class = "data.frame")
 

Это и есть код:

 Library(igraph)
m <- as.matrix(replace(sample, sample == "", "NA"))
g <- simplify(graph_from_edgelist(rbind(m[, 1:2], m[, 2:3]), directed = TRUE))
l <- layout_with_sugiyama(g)
plot(g,
  layout = -l$layout[, 2:1],
  edge.arrow.size = 0.1,
  vertex.size = 2.5,
  vertex.color = "grey",
  vertex.label.dist = 1,
  edge.arrow.width = 1.5,
  edge.width = seq(0.5, 0.08),
  edge.lty = "solid",
  edge.color = "gray",
  vertex.label.cex = 0.7,
  is.rm = TRUE,
  vertex.label.color = "black"
)
 

Хочу, чтобы я хотел стать таким, как этот:
введите описание изображения здесь
Я думаю, что этот создается вручную. В любом случае окончательная схема должна быть такой же, как эта, и также может упорядочивать положение элемента.

Спасибо!

Комментарии:

1. «линия Tamiang должна проходить во второй строке вверху, а линия Sigulai -> ОШИБКА ->> NA проходит в нижней части графика»>> Каковы общие правила сортировки узлов?

2. @Maurits это проблема, о которой я не знаю. Потому что опубликовал это.

3. Как мы можем помочь, если вы не скажете нам, как сортировать узлы? Каковы правила? Что определяет, какие термины находятся вверху, а какие внизу? Что определяет порядок? Мы можем только помочь с реализацией. Вам нужно объяснить логику!

4. @Kian можете ли вы предоставить код (/ пакеты), который вы использовали для создания изображения?

5. @slamballais и Maurits Я добавил коды, которые использовались для создания сюжета.

Ответ №1:

В вашем генераторе компоновки есть аргумент layers , который принимает список подсетей. Если вы вручную создадите этот список в нужном вам порядке, Сугияма будет следовать этому порядку и построит сети, как указано.

 layers = list(c("Tamiang","Tamiang","12_Tamiang"),
              c("Alas","Alas","2_Alas"),
              ....))
 

А затем вы вызываете макет с этим списком слоев:

 l <- layout_with_sugiyama(g, layers=apply(sapply(layers,function(x) V(g)$name %in% x), 1, which))
 

Есть только одна небольшая проблема: идентификаторы ваших узлов не уникальны. Вам придется сделать их уникальными, чтобы sapply() функция работала правильно в этом примере.

Также ознакомьтесь с руководством для получения дополнительной информации об этом макете: https://igraph.org/r/doc/layout_with_sugiyama.html

Комментарии:

1. Да, идентификаторы узлов не являются уникальными. Я застрял здесь, не знаю, как это сделать.

2. Просто сделайте их уникальными. Вы откуда-то получили свои данные, верно? В процессе сбора данных и внесения их в структурированный список просто измените имена элементов на уникальные идентификаторы (например, вставьте «lang_» в качестве префикса для всех языков).

3. Я добавил номер и префикс. у меня та же проблема. Как вы видите, Gajo/ Gayo , чтобы добавить номер или префикс. тем не менее, это дубликат.

4. Знаете ли вы, как решить эту проблему? В любом случае, я действительно ценю ваш ответ.

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