Нарисуйте график с меткой времени на узлах

76
10

У меня есть (направленный ациклический) граф, так что каждый узел имеет дискретную метку времени, то есть каждый узел помечен цифрой: 1,2,3,4...

График может содержать более одного компонента, а метка времени увеличивается с направлением графика.

У меня есть граф как объект netowrkx, и теперь я хочу создать фигуру в python с графом, а высота узла определяется его меткой времени (нижние метки времени сверху и выше внизу и узлы с одинаковыми отметки времени находятся на одинаковой высоте). Это означает, что, например, 2 компонента могут "начинаться" (их высота корня) на разных начальных высотах, если их метки времени различны.

с другой стороны, данный узел A, помеченный временем = 4, и узел B, помеченный 5, я хочу, чтобы B был ниже на рисунке.

3-й пример: если 2 узла являются дочерними элементами третьего узла, но они были созданы в разное время - край будет длиннее для последнего, каждый из которых будет находиться на своем собственном временном уровне.

напишите сейчас, код, который у меня есть, очень прост:

import networkx as nt
import matplotlib.pyplot as plt

graph = networkx.DiGraph()
self.graph.add_node("A", time = 1)
...# Add more nodes
graph.add_edge("A","B")
...# Add more edges
plt.figure(1,figsize=(30,10))
pos=nt.graphviz_layout(graph,prog='dot')
networkx.draw(graph,pos,with_labels=False,arrows=True, node_size = 80)

(У меня недостаточно репутации для загрузки изображения результатов... :-))

Как я могу нарисовать это в Python? Какой пакет может мне помочь?

спросил(а) 2021-01-19T11:31:54+03:00 2 месяца, 3 недели назад
1
Решение
62

Позиции узлов определяются в словаре, с ключевым именем узла и значением кортежа с координатами x и y.

Вы можете увидеть это, напечатав переменную pos после создания:

pos=nt.graphviz_layout(graph,prog='dot')
print pos

# EXAMPLE RESULT
{'A': (51.5, 15.3), 'B': (20.0, 60.4)}

Более высокое значение в координате y поместит узел выше на график. Поэтому, если вы хотите, чтобы корневые узлы находились в верхней части (значение меньшей отметки времени), используйте отрицательные метки времени, поскольку -1 будет больше, чем -2.

Чтобы автоматизировать процесс размещения узлов, вам нужно некоторое уравнение, основанное на времени.

pos = {}
for key, value in graph.node.items():
height = value['time'] # Time value as defined when adding the node 'key'
pos[key] = (50, -height)

Это поместит узлы вертикально, основываясь на их отметках времени. Таким образом, расстояние между двумя узлами, создаваемыми в моменты 1 и 4, будет в два раза больше, чем два узла, созданных в моменты 1 и 2. В этом примере я сохранил горизонтальный компонент статический (50), и все узлы окажутся в вертикальной линии, Вы должны иметь возможность варьироваться в зависимости от ваших потребностей.

ответил(а) 2021-01-19T11:31:54+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема