#r #dataframe #nodes #igraph #vertex
Вопрос:
Я пытаюсь изменить vertex.shape, но это не работает :
У меня есть фрейм данных, такой как :
Locus X2 X3 Prophage Vi_1236 Vi_456 5 yes Vi_1254 Vi_263 6 no Vi_1369 Vi_139 2 undef
И я хочу получить график с диаграммой , на которой я могу раскрасить узлы в соответствии с их центральностью между ними и когда Профаг == «да», я хочу квадратный узел, когда его нет, узел круга, а когда его нет, узел треугольника.
Итак, я сделал :
phage = graph.data.frame(innerJoinDf) vertex = ifelse(phage$prophage == "yes","square","circle") plot.igraph(phage, vertex.label = NA, vertex.color = betweenness(phage), vertex.shape = vertex)
И я получаю следующую ошибку:
Error in .igraph.shapes[[shape[el[x, 1]]]] : wrong arguments for subsetting an environment
Не могли бы вы, пожалуйста, помочь мне?
Комментарии:
1. Способ организации ваших данных
Prophage
-это атрибут ребра, а не атрибут вершины2. Так как же я могу это сделать ?
3. Поэтому, предполагая, что вы хотите использовать
Prophage
для присвоения формы обеим вершинам, указанным вLocus
иX2
иProphage
уникальным в ваших данных для этих вершин, один из способов, которым вы могли бы определить вектор, содержащийProphage
атрибут,vertex lt;- setNames(rep(innerJoinDf$Prophage, 2), unlist(innerJoinDf[c("Locus", "X2")]))
а затем использовать его для обновления атрибута формы вершины вашего графика, который находится,V(g)
например, вV(phage)$shape = c( "circle", "square")[(vertex[V(phage)$name] == "yes") 1L]
4. Спасибо, это работает, но что значит » 1 Л»
5. Например,
innerJoinDf$Prophage == "yes"
это логический вектор. Внутренне ИСТИННО == 1 и ЛОЖНО == 0. Поэтому, добавив единицу (1L-целое число 1), мы преобразуем логический вектор в вектор единиц и двоек (который затем мы используем для подмножестваc( "circle", "square")
вектора, например, выбираем первый или второй элемент).
Ответ №1:
То, как ваши данные организованы в innerJoinDf
значениях, Prophage
интерпретируется как граничные атрибуты. Вы можете увидеть это, посмотрев на свой igraph
объект; где атрибуты вершины обозначены v
символом, а ребро e
-символом . (Вы можете увидеть фактические атрибуты с помощью vertex_attr(phage)
и edge_attr(phage)
).
library(igraph) phage lt;- graph_from_data_frame(innerJoinDf) phage # IGRAPH d6af3b4 DN-- 6 3 -- # attr: name (v/c), X3 (e/n), Prophage (e/c) # edges from d6af3b4 (vertex names): # [1] Vi_1236-gt;Vi_456 Vi_1254-gt;Vi_263 Vi_1369-gt;Vi_139
Ваш код vertex = ifelse(phage$prophage == "yes","square","circle")
не сработал, так как вы не можете получить доступ к атрибутам напрямую с помощью $
обозначения (дополнительно Prophage
начинается с верхнего регистра P
). Одним из способов доступа является использование V(graph)
, E(graph)
а затем $
, например, обозначения V(phage)$name
.
Как вы хотите использовать Prophage
для присвоения формы обеим вершинам, указанным в Locus
, и X2
это предполагает, что Prophage
это уникально в ваших данных для этих вершин. Один из способов сделать это-определить вектор, содержащий Prophage
атрибут, а затем использовать его для обновления атрибута формы вершины вашего графика, в котором он хранится V(g)
(вы, конечно, можете просто передать результаты из функции ifelse
в igraph
график вместо явного добавления shape
атрибута).
vertex lt;- setNames(rep(innerJoinDf$Prophage, 2), unlist(innerJoinDf[c("Locus", "X2")])) vertex # Vi_1236 Vi_1254 Vi_1369 Vi_456 Vi_263 Vi_139 # "yes" "no" "undef" "yes" "no" "undef" # This seems a bit convoluted but is an attempt to match by vertex name rather than order V(phage)$shape lt;- ifelse(vertex[V(phage)$name] == "yes", "square", "circle") # or # V(phage)$shape lt;- c( "circle", "square")[(vertex[V(phage)$name] == "yes") 1L] V(phage)$shape # [1] "square" "circle" "circle" "square" "circle" "circle"
Данные
innerJoinDf=read.table(header=TRUE, text=" Locus X2 X3 Prophage Vi_1236 Vi_456 5 yes Vi_1254 Vi_263 6 no Vi_1369 Vi_139 2 undef")