#r #attributes #igraph
#r #атрибуты #igraph
Вопрос:
Я пытаюсь использовать igraph
в первый раз, и я заинтересован в добавлении определенных атрибутов группировки к некоторой вершине с намерением использовать эту информацию для изменения их цвета на графике позже. График, который я пытаюсь создать, представляет собой сеть соединений электродов.
Я постараюсь подробно объяснить процесс.
Сначала я создаю свою сеть, используя матрицу инцидентности:
net <- graph_from_incidence_matrix(inc_mat)
> net
IGRAPH 92adce4 UN-B 50 422 --
attr: type (v/l), name (v/c)
edges from 92adce4 (vertex names):
[1] C3 --C4 C3 --CP1 C3 --CP6 C3 --Cz C3 --F3 C3 --F4 C3 --FC1 C3 --FC2 C3 --FC5 C3 --Fp1 C3 --Fp2
[12] C3 --Oz C3 --P3 C3 --P8 C3 --POz C4 --C3 C4 --CP1 C4 --CP2 C4 --CP5 C4 --Cz C4 --F4 C4 --F7
[23] C4 --F8 C4 --FC1 C4 --FC2 C4 --FC5 C4 --FC6 C4 --Fp2 C4 --Fz C4 --P3 C4 --P4 C4 --P7 C4 --P8
[34] CP1--C3 CP1--CP5 CP1--CP6 CP1--Cz CP1--F4 CP1--F7 CP1--FC1 CP1--FC2 CP1--FC5 CP1--Fp1 CP1--Fp2
[45] CP1--Oz CP1--P3 CP1--P7 CP1--POz CP1--Pz CP2--C3 CP2--C4 CP2--CP2 CP2--CP6 CP2--F4 CP2--F7
[56] CP2--FC2 CP2--FC6 CP2--Fp1 CP2--Fz CP2--Oz CP5--C3 CP5--C4 CP5--CP2 CP5--CP5 CP5--Cz CP5--F3
[67] CP5--F4 CP5--F8 CP5--FC2 CP5--FC5 CP5--Fp1 CP5--Fp2 CP5--Oz CP5--P3 CP5--P7 CP5--P8 CP5--POz
[78] CP6--C3 CP6--CP2 CP6--CP5 CP6--Cz CP6--F3 CP6--F4 CP6--F7 CP6--FC1 CP6--FC2 CP6--FC6 CP6--Fp1
... omitted several edges
Насколько я понимаю, это ребра моего графика, и это нормально. Теперь я пытаюсь добавить атрибут группировки к каждой вершине, чтобы позже я мог обратиться к этому атрибуту для раскрашивания. Например, C3-C4-Cz я хочу назвать их «cen». Для этого у меня есть другой фрейм данных, подготовленный с тем же количеством наблюдений, что и вершины, и в том же порядке (в данном случае 50) для этой цели:
> head(vertexfam)
Elec1 Fam
1 C3 cen
2 C4 cen
3 CP1 cenp
4 CP2 cenp
5 CP5 cenp
6 CP6 cenp
Теперь, согласно документации, я понимаю, что могу сделать это прямолинейно, например, атрибут за атрибутом V(net)[1]$group <- "central"
, и из-за этого я попытался автоматизировать процесс.
> V(net)
50/50 vertices, named, from 92adce4:
[1] C3 C4 CP1 CP2 CP5 CP6 Cz F3 F4 F7 F8 FC1 FC2 FC5 FC6 Fp1 Fp2 Fz Oz P3 P4 P7 P8 POz Pz C3
[27] C4 CP1 CP2 CP5 CP6 Cz F3 F4 F7 F8 FC1 FC2 FC5 FC6 Fp1 Fp2 Fz Oz P3 P4 P7 P8 POz Pz
> for (i in 1:nrow(vertexfam)){
V(net)[i]$group <- vertexfam$Fam[i]
}
Однако, как только я проверяю, установлен ли атрибут, результат не является ожидаемым:
> V(net)$group[1]
[1] NA
Кстати, я также пытался устанавливать атрибуты один за другим, и, похоже, у меня это тоже не работает. Я также попытался использовать механизм настройки базового атрибута set_edge_attr(net, name = 'group', index = V(net), value = vertexfam$Fam)
, и результат тот же. Я намерен сделать это и с ребрами, но сначала мне нужно выяснить, в чем ошибка.
Может ли кто-нибудь иметь представление или понимание, почему это может происходить или что я делаю не так?
Заранее большое спасибо за вашу помощь!
Комментарии:
1. возможно, вы могли бы привести воспроизводимый пример. В общем, я думаю, вы бы упростили себе жизнь, если бы расплавили матрицу инцидентности, а затем использовали
graph_from_data_frame()
, используя опцию vertices для передачи атрибутов.2. Вы абсолютно правы. Я действительно не знал об этой опции. Как я уже сказал, я просто «использовал» пакет в течение 2 дней. Попробовал ваше предложение, и оно действительно намного проще. Большое спасибо.