Как читать в взвешенном списке редакций с igraph в Python (не в R)?

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

E06.1644.1  A01.908.1   0.5
E06.1643.1  A01.908.1   0.02 
E06.1644.1  A01.2060.1  0.7

Сейчас я импортирую это так:

g=Graph.Read_Ncol("igraph.test.txt",names=True,directed=False,weights=True)
igraph.plot(g, "igraph.pdf", layout="kamada_kawai")

Когда я печатаю имена или веса (которые, как я предполагаю, должны быть длинами кромок), они печатаются отлично:

print(g.vs["name"])
print(g.es["weight"])

Однако вершины пустые, и длины кажутся непропорциональными их значениям. Кроме того, слишком много узлов (дублируется A01.908.1). Что я делаю неправильно? Заранее спасибо....


person Vince    schedule 15.11.2014    source источник


Ответы (1)


Вершины пусты, потому что igraph не использует атрибут name в качестве меток вершин автоматически. Если вы хотите использовать имена в качестве меток, у вас есть два варианта:

  1. Скопируйте атрибут вершины name в атрибут label: g.vs["label"] = g.vs["name"]

  2. Скажите plot явно, что вы хотите, чтобы имена использовались в качестве меток: plot(g, "igraph.pdf", layout="kamada_kawai", vertex_label=g.vs["name"])

Думаю, то же самое относится и к весам; igraph не использует веса автоматически для определения толщины каждого края. Если вы хотите сделать это, измените масштаб вектора веса до значимого диапазона без толщины (скажем, от 0,5 до 3), а затем установите масштабированный вектор как атрибут width edge:

>>> g.es["width"] = rescale(g.es["weight"], out_range=(0.5, 3))

В качестве альтернативы вы также можете использовать аргумент ключевого слова edge_width в вызове plot():

plot(g, ..., edge_width=rescale(g.es["weight"], out_range=(0.5, 3)))

См. help(Graph.__plot__) для получения дополнительных сведений об аргументах ключевых слов, которые можно передать plot().

Что касается дублированного узла, я сильно подозреваю, что в вашем входном файле есть опечатка и эти два имени не эквивалентны; например, в конце может быть пробел. Внимательно осмотрите g.vs["name"], чтобы убедиться в этом.

Обновление: если вы хотите, чтобы длины ребер были пропорциональны заданному весу, я боюсь, что в общем случае этого сделать нельзя - это просто создать график, на котором заданные длины не могут быть достигнуты в 2D-пространстве. Существует метод, называемый многомерным масштабированием (MDS), который может восстанавливать положения узлов из матрицы расстояний, но для этого требуется, чтобы расстояние было указано для каждой пары узлов (т. Е. Также для разъединенных пар). .

Алгоритм компоновки Камада-Каваи, который вы использовали, может до некоторой степени учитывать веса ребер (он может застрять в локальных минимумах, поэтому вы, вероятно, не получите точного результата), но он интерпретирует веса как < em> сходства, а не расстояния, поэтому чем больше вес, тем ближе будут конечные точки. Однако вам все равно нужно указать igraph использовать веса при расчете макета, например:

>>> similarities = [some_transformation(weight) for weight in g.es["weight"]]
>>> layout = g.layout_kamada_kawai(weights=similarities)
>>> plot(g, layout=layout, ...)

где some_transformation() - «разумное» преобразование расстояния в подобие. Это требует некоторых проб и ошибок; Я обычно использую преобразование, основанное на сигмоидной функции, которая преобразует среднее расстояние до подобия 0,5, расстояние (median + 2 sd) до 0,1 и расстояние (median - 2 sd) до 0,9 (где sd - стандартное отклонение распределение расстояний), но это не гарантируется во всех случаях.

person Tamás    schedule 15.11.2014
comment
Спасибо, Тамас. Во-первых, как мне изменить длину ребер, чтобы они были пропорциональны этим значениям? Я дважды проверил опечатки, и в дублированных узлах нет опечаток. Хотя когда распечатываю, дубликатов нет. Похоже, что график заменил A01.908 на A01.2060 ... - person Vince; 16.11.2014
comment
Извините, я изменил вопрос, чтобы сосредоточиться на длине кромок, а не на весе кромок .... - person Vince; 16.11.2014
comment
Немного обновил свой ответ. - person Tamás; 16.11.2014
comment
Большое спасибо, Тамас! - person Vince; 17.11.2014