иерархическая / упорядоченная визуализация плоского графа - PullRequest
1 голос
/ 10 апреля 2020

Я использую NetworkX в python3 просто для визуализации графика. Узлы, представляющие точки с определенной высотой. Узлы с одинаковой высотой никогда не будут соединены через один край. Они могут указывать либо «вверх», «вниз», либо и то и другое.

Самая ясная визуализация, которую я могу сделать на данный момент, - это использование kamada_kawai_layout. Смотрите это изображение: kamada_kawai graph . Этикетки могут быть забыты на данный момент. У меня есть высота каждой точки, доступная в виде целых чисел, и цвета на этом изображении были сопоставлены с этой отметкой.

Изображение четкое, но я хотел бы заказать график «иерархический», основываясь на отметке. Таким образом, каждый узел с одинаковой высотой или атрибутом в предопределенном y-value.

Я могу сделать это вручную, просто назначив каждому узлу y-pos его фактической высоты и x-pos в свободном месте. для того же значения у. См. Это изображение: ручное «дерево»

Однако, как видно из рисунка, края пересекаются, и вручную (на бумаге) я бы сделал несколько разных вариантов для группировки соседних узлы.

Есть ли в NetworkX что-то похожее на упорядоченную планарную компоновку? Так что я могу зафиксировать значения y для его атрибута, но перемешать значения x, оптимизируя длину ребер и / или пересечений?

# node elevation is the y-value of the position
nodePos = {'0': [0.0, -0.0], '5': [0.0, -1.0], '1': [1.0, -0.0], '4': [1.0, -1.0], '2': [2.0, -0.0], '3': [2.0, -1.0], '7': [0.0, -2.0], '8': [1.0, -2.0], '6': [2.0, -2.0], '10': [0.0, -3.0], '12': [1.0, -3.0], '11': [2.0, -3.0], '9': [3.0, -2.0], '15': [0.0, -4.0], '14': [1.0, -4.0], '13': [3.0, -3.0], '16': [0.0, -5.0], '17': [1.0, -5.0], '20': [0.0, -6.0], '19': [1.0, -6.0], '23': [2.0, -6.0], '22': [3.0, -6.0], '21': [4.0, -6.0], '18': [2.0, -5.0], '24': [0.0, -7.0]}  
edges = [('0', '5'), ('5', '6'), ('1', '4'), ('4', '8'), ('2', '3'), ('3', '7'), ('7', '10'), ('8', '10'), ('6', '10'), ('6', '12'), ('6', '11'), ('10', '9'), ('10', '15'), ('10', '14'), ('15', '17'), ('14', '13'), ('14', '16'), ('16', '20'), ('16', '19'), ('16', '23'), ('17', '22'), ('17', '21'), ('20', '24'), ('19', '18')]
...