Вершины пусты, потому что igraph не использует атрибут name
в качестве меток вершин автоматически. Если вы хотите использовать имена в качестве меток, у вас есть два варианта:
Скопируйте атрибут вершины name
в атрибут label
: g.vs["label"] = g.vs["name"]
Скажите 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