Удаление или скрытие заданных c ребер в iGraph на основе узлов - PullRequest
0 голосов
/ 04 марта 2020

Этот вопрос является продолжением моего предыдущего вопроса, с которым я некоторое время боролся.

Я пытаюсь визуализировать сети в R с помощью пакета iGraph, однако я хотите визуализировать разные подмножества одной и той же сети в одной и той же компоновке. Таким образом, будут вершины, которые отличаются между подмножествами, но я хочу, чтобы каждая вершина и ребро были в одном и том же месте на каждом графике.

Сначала я попытался сделать это, создав координаты общего графа, а затем построение подграфов с одинаковыми координатами. Однако это привело к нескольким проблемам:

  1. iGraph основывает позиции вершин на их числе, поэтому, как только вы удаляете одну вершину из графа для подграфа, номера всех последующих вершин изменяются и, следовательно, их позиции будут неправильными.
  2. Давая координаты вершин, которых больше не существует, iGraph (я думаю) все еще пытается построить их так, чтобы вы могли получить узлы, не связанные с подграфом.

Итак, вместо этого я попробовал другую тактику c. Теперь я строю график в целом, но стараюсь просто раскрасить те части графика, которые мне не нужны. Итак, в следующем примере:

set.seed(123)

g_overall = erdos.renyi.game(25, 0.3)

removals = c("2" ,"5" ,"13", "19", "25")

coords = layout_as_tree(g_overall,
               root = 1,
               circular = FALSE,
               flip.y = FALSE,
               mode = "all"
               )

V(g_overall)$colour = ifelse(V(g_overall) %in% removals, "blue", "red")

plot.igraph(g_overall,
      layout = coords,
      vertex.shape = "none",
      vertex.label = V(g_overall),
      vertex.label.color = V(g_overall)$colour
      )

Это дает следующее:

Basic plot

Затем, если я изменю код на:

plot.igraph(g_overall,
      layout = coords,
      vertex.shape = "none",
      vertex.label = ifelse(V(g_overall)$colour == "red", V(g_overall), NA),
      vertex.label.color = V(g_overall)$colour
      )

Это становится:

Items removed from plot

Это ПОЧТИ сейчас, однако очевидно, что теперь есть ребра, которые необходимо удалить и я не знаю, как подойти к этому. В идеале я хотел бы использовать подобное ifelse l oop с чем-то вроде: ifelse(starting_node$colour == "red", edge_colour = "black", edge_colour = "white", чтобы цвет ребра основывался на узлах, к которым он подключен (и становился невидимым, как узлы). Но я не могу придумать, как это сделать.

Любой совет приветствуется.

PS. Конечно, я рассмотрю ответы, основанные на полном удалении краев, но я подозреваю, что это изменит макет и поэтому скорее будет «скрывать» их.

1 Ответ

1 голос
/ 08 марта 2020

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

removals = c(2, 5, 13, 19, 25)

С этим

g2 = induced_subgraph(g_overall, V(g_overall)[-removals])
coords2 = coords[-removals,]

plot.igraph(g2,
      layout = coords2,
      vertex.shape = "none",
      vertex.label = V(g_overall)[-removals],
      vertex.label.color = V(g_overall)$colour[-removals]
      )

Reduced graph

Я сохранил те же метки на уменьшенном графике, имитируя ваш код. Для другого способа уменьшить график, но сохранить старые метки, см. метки узлов после удаления в R

...