использование igraph для построения асимметричных связей - PullRequest
0 голосов
/ 12 сентября 2018

HAVE - это двухрежимная матрица смежности ведущих актеров (идентификаторы в 1-м столбце) и вспомогательных акторов (идентификаторы в именах столбцов).

    f1  f2  f3  f4  f5  f6  f7
f1  0   1   0   2   5   0   6
f2  0   0   3   0   0   6   0
f3  9   4   0   1   0   0   0

Числа в матрице - это количество фильмов.Матрица асимметричная.Например, f2 сыграла главную роль в фильме с f3 в роли второго плана три раза, но f3 была главной в фильме, где f2 поддержала четыре раза.

Мне нужно создать ориентированный граф, где стрелки рисуются от актеров к сторонникам - размер стрелки / дуги должен быть пропорционален числу films.См. Ниже макет диады f2-f3: enter image description here

Одинаковые соглашения об именах в обоих «режимах» графа, очевидно, вызывают проблемы.Дайте мне знать, если у вас есть какие-либо четкие решения, или если я не задаю свой вопрос хорошо (я новичок в igraph и двухрежимной проекции).Спасибо!

1 Ответ

0 голосов
/ 12 сентября 2018

Если вы посмотрите на страницу справки help(igraph.plotting), вы увидите, что там написано:

arrow.size

Размер стрелки. В настоящее время это константа, поэтому одинаково для каждого края.

Так что я не думаю, что это возможно сделать размером с наконечник стрелки. Однако, безусловно, можно изменять ширину линии стрелок, используя параметр edge.width.

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

Пример данных

CoStar = matrix(c(0,1,3,1, 3,0,3,1, 2,1,0,0, 0,1,1,0), nrow=4)
CoStar
     [,1] [,2] [,3] [,4]
[1,]    0    3    2    0
[2,]    1    0    1    1
[3,]    3    3    0    1
[4,]    1    1    0    0

Теперь мы можем превратить это в графический объект и отобразить его, используя веса в качестве ширины ребра. Вам нужно использовать параметр edge.curved, чтобы край A-> B не находился сверху края B-> A.

library(igraph)
G = graph_from_adjacency_matrix(CoStar, weighted=TRUE)
V(G)$label = c("Steve", "Sean", "Andy", "Tim")
plot(G, edge.width=E(G)$weight+1, edge.arrow.size=1.5, edge.curved=0.25)

Asymmetric graph

Вы можете видеть, что размеры ребер пропорциональны весам (количество появлений суставов).

...