igraph: Как исправить положение узла при рисовании постепенно растущих подграфов того же графика
У меня есть график, на котором я предварительно рассчитал положение узлов, запустив ForceAtlas2 в Gephi, и затем я пытаюсь нарисовать с ìgraph
в питоне. Каждый узел имеет date
атрибут, поэтому я повторяюсь по всем годам, вычисляю соответствующие подграфы и рисую их, чтобы создать эффект анимации.
Однако, поскольку узлы продолжают добавляться в граф, предыдущие узлы не обязательно сохраняют свои старые позиции, аналогично тому, что описано в этом посте.
Мой код выглядит следующим образом:
colors = [color_list[int(g.vs[v]["Modularity Class"])] for v in range(0, len(g.vs))]
label_sizes = [sz / 4.0 for sz in g.vs["size"]]
nodes_in_years = defaultdict(list) # keeps a list of nodes per year
for v in g.vs:
year = int(v["date"][:4]) # convert the first 4 digits of the date to year
nodes_in_years[year].append(v)
nodes_incremental = []
for y, nodes in nodes_in_years.items():
nodes_incremental += nodes
h = g.subgraph(nodes_incremental)
plot(h, "graph-igraph%d.png"%y,
bbox=(640,480),
vertex_color=colors,
vertex_label_size=label_sizes,
keep_aspect_ratio=False,
)
Ниже приведены два последовательных снимка.
Во втором снимке узлы слегка "сжаты", так как больше узлов добавлено слева.
Как я могу держать узлы в фиксированных положениях? Я пробовал с xlim
настройка и ylim
но я не могу устанавливать правильные значения
1 ответ
xlim
а также ylim
для интерфейса R igraph; они не имеют никакого эффекта в Python. Обычный прием, который нужно использовать, - это найти минимальные и максимальные координаты X и Y во всех снимках, а затем поместить две ложные вершины (с их shape
атрибут установлен в None
) в верхнем левом и нижнем правом углах макета. Убедитесь, что вы включили эти ложные вершины во все снимки с одинаковыми координатами - это гарантирует, что макеты будут масштабироваться одинаково в каждом снимке в соответствии с указанным ограничивающим прямоугольником.
Если вы не использовали shape
атрибут с вашим текущим макетом, обратите внимание, что добавление shape
атрибут к поддельным вершинам также добавит shape
атрибут (со значением по умолчанию None
) к "реальным" вершинам, поэтому вы должны вручную установить shape
атрибут всех вершин, кроме двух поддельных "circle"
,