Граница графика по размеру / длине в Igraph 0.6 для Python 2.7 (не для R)

Похоже, я не могу найти решение следующей проблемы:

Я хочу нанести края по размеру (длине, а не ширине).

Я имею в виду, что если край между вершинами V1 и V2 равен 20, я хотел бы нанести этот край ровно на 20 пикселей.

Если другой край между V2 и V3 равен 60, этот край будет длиннее на графике.

Не могу найти, как указать размер или длину кромки. Возможно, это невозможно с простой строкой кода, такой как другие атрибуты для построения графика (размер вершины, цвета, ширина и т. Д.) Учебники Igraph не дали ответа на этот вопрос. Наверное, это сложно.

Ориентация формы графа не важна, даже если фиксированные ребра будут давать постоянную форму, я полагаю.

Граф неориентированный, но имеет множество последовательностей вершин и ребер.


person Laci    schedule 13.12.2012    source источник


Ответы (1)


В igraph нет атрибута edge, который позволил бы вам напрямую контролировать длину ребра. Основная причина заключается в том, что точное соблюдение всех ограничений длины невозможно, если ваш график не имеет очень разреженной структуры и / или длины очень специфичны.

Единственное, что мне приходит в голову, - это метод, называемый многомерным масштабированием (MDS). Не вдаваясь в кровавые подробности, входными данными MDS является матрица n x n (где n - количество вершин в вашем графике ), а ячейки матрицы содержат желаемые расстояния между точками. Результатом MDS является расположение вершин в некотором пространстве меньшей размерности (обычно в 2D-плоскости), где сводится к минимуму общая квадратичная разница между фактическим и желаемым расстояниями. В частности, если желаемые расстояния могут быть удовлетворены именно в 2D-пространстве, MDS найдет эту конфигурацию для вас. igraph включает MDS в качестве алгоритма компоновки в метод layout_mds объектов Graph.

Теперь вот и загвоздка. Я упомянул, что матрица расстояний имеет размер n x n. Проблема в том, что это означает, что вам нужно прописать расстояние для каждой пары вершин, а не только для соединенных. У меня сложилось впечатление, что в вашей проблеме это не так (т.е. у вас есть расстояния только для связанных пар вершин), и в этом случае MDS бесполезен, если вы не можете каким-то образом «приблизить» расстояния между разъединенными парами вершин - но в этом случае макет также будет лишь приблизительным.

Другой вариант - схема Камада-Каваи (см. Kamada, T. & Kawai, S. (1989). Алгоритм для рисования общих неориентированных графиков. Письма об обработке информации, 31 , 7-15), где кромки моделируются как пружины, причем каждая пружина имеет заданную равновесную длину. Компоновка будет пытаться установить конфигурацию, близкую к физическому равновесию (и в этом случае вся длина пружины близка к их равновесной длине, поэтому они не оказывают силы на свои конечные точки, то есть вершины). Проблема здесь в том, что схема Камада-Каваи в графике не подготовлена ​​для работы с пружинами разной равновесной длины, т.е. предполагается, что каждое звено имеет одинаковую «желаемую» длину. Если вы хотите реализовать макет Kamada-Kawai самостоятельно с нуля на Python, это может быть еще одной возможностью.

person Tamás    schedule 13.12.2012
comment
Часть MDS очень сложна. Я постараюсь реализовать это хотя бы на экспериментальном уровне, но я буду бездельничать, потому что мне придется просматривать документацию. Отчитаюсь с результатом. Спасибо, Тамаш! - person Laci; 14.12.2012