Как создать графики в iGraph в R с соответствующими координатами узла (и удалить узлы без ребер) - PullRequest
0 голосов
/ 06 января 2020

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

По сути, я Построение биологических путей в R с использованием iGraph, я намереваюсь взять подмножество генов (узлов) из каждого пути и построить их, затем взять второе (и третье / четвертое) подмножество генов и построить их так же. Я планирую сети как деревья для простоты просмотра, и я также, в частности, хочу, чтобы у каждого поднабора путей были одинаковые узлы в одних и тех же позициях (некоторые поднаборы отличаются только на 1/2 узла, другие - на десятки). Опять же, это для удобства просмотра (вместо имен), поэтому, например, я бы хотел, чтобы GENE1 и GENE2 каждый раз находились в одном и том же положении по отношению друг к другу, но, очевидно, на некоторых графиках GENE1 или GENE2 не будут присутствует.

Вот мой текущий код (вместе с несколькими комментариями) и загружены некоторые примеры графиков:

coords = layout_as_tree(isubpathway_info, ### isubpathway_info is the iGraph object
                          root = match(geneKEGG, V(isubpathway_info)$name), ### Matching the nodes to names
                          circular = FALSE,
                          flip.y = FALSE,
                          mode = "all")

Изменить для ясности: Выше и ниже приведены две соответствующие части кода, которые встречаются в пределах oop. Главное, что меняется с каждым l oop, это то, что он загружается в другой графовый объект и использует только первый экземпляр l oop для создания координат. Я не включил остальную часть кода, потому что он на самом деле не имеет отношения к вопросу.

### This is done as a loop, so the isubpathway_info is different each time but coords should be the same
### I.e.: different nodes/edges but same coordinates

plot(isubpathway_info,
       layout = coords,
       vertex.size = 50,
       #vertex.label = gene_details$hgnc_symbol[gene_nums], ### I'm not currently using this because labels basically obscure everything
       vertex.label = NA,
       rescale = FALSE,
       ylim = c(1,4),
       xlim = c(-10,10),
       asp = 0
       )

Two example plots from different pathway subsets

Вопросы:

  1. Итак, как вы можете видеть, график, по-видимому, почти делает то, что я хочу. Однако по какой-то причине он все еще строит все узлы, несмотря на тот факт, что он использует разные подмножества узлов (и одинаковые координаты) в каждом случае. Кто-нибудь знает, как мне это исправить?

  2. Мой второй вопрос не связан с первым, но все еще затрагивает тот же сегмент кода. Возможно, вы заметили, что графики довольно маленькие, а также что у меня есть rescale = FALSE на графике. Казалось, это был единственный способ, которым я смог найти, чтобы весь график действительно поместился в окне RStudio, но он не идеален и кажется непредсказуемым относительно того, какого размера он будет на самом деле. Поэтому, если кто-нибудь знает лучший способ сделать это, он также будет оценен!

Редактировать 2:

По просьбе одного из комментаторов я попытался создать воспроизводимый пример моей проблемы. Это привело меня к другому вопросу, который казался относительно похожим на мой собственный , однако решение, которое они использовали, похоже, не сработало для меня.

set.seed(123)

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

removals1 = c("2" ,"5" ,"13", "19", "25")
removals2 = c("2" ,"5" ,"11", "13", "19", "22", "24", "25")

g1 = induced_subgraph(g_overall, V(g_overall)[-as.numeric(removals1)])
g2 = induced_subgraph(g_overall, V(g_overall)[-as.numeric(removals2)])

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

plot.igraph(g1,
        layout = coords)

plot.igraph(g2,
        layout = coords[-as.numeric(removals),])

Reproducible graphing attempt

Несколько замечаний:

  1. Я удалил большинство аспектов определения размеров из функции построения графика для простоты (и я просто вернусь к этому позже).
  2. Теоретически, я буду сравнивать подпути, которые будут происходить из одного более крупного пути, поэтому я создал оба графических объекта из одного более крупного графического объекта (на самом деле это будет сделано другим методом, но я ' Я надеюсь, что это достаточно похоже). Вы также можете прокомментировать, что я не учел ситуацию, когда у g2 есть узел, которого нет у g1, но я надеюсь, что это не будет проблемой для меня.
  3. Вы также можете заметить что по какой-то причине этот метод удаления, который я использую, на самом деле НЕ правильно удалял намеченные вершины (например, ни у одной из сторон не должно быть вершины «5», а у обеих есть). Это одно - боль, но это не совсем то, чем я занимаюсь. Что меня больше всего беспокоит, так это то, что теоретически числа должны находиться в одинаковых позициях на каждом графике, когда они присутствуют. Но они не ...

Я действительно надеюсь, что это позволит кому-то прийти мне на помощь!

Ps В этом случае g1 и g2 оба будут isubpathway_info в разных итерациях l oop.

1 Ответ

1 голос
/ 16 января 2020

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

set.seed(123)

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

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

removals1 = c("2" ,"5" ,"13", "19", "25")
removals2 = c("2" ,"5" ,"11", "13", "19", "22", "24", "25")

g1 = delete_vertices(g_overall, removals1)
g2 = delete_vertices(g_overall, removals2)

plot.igraph(g1,
        layout = coords[-as.numeric(removals),])

plot.igraph(g2,
        layout = coords[-as.numeric(removals),])

...