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,
          )

Ниже приведены два последовательных снимка. график 2001 график 2002

Во втором снимке узлы слегка "сжаты", так как больше узлов добавлено слева.

Как я могу держать узлы в фиксированных положениях? Я пробовал с xlim настройка и ylim но я не могу устанавливать правильные значения

1 ответ

Решение

xlim а также ylim для интерфейса R igraph; они не имеют никакого эффекта в Python. Обычный прием, который нужно использовать, - это найти минимальные и максимальные координаты X и Y во всех снимках, а затем поместить две ложные вершины (с их shape атрибут установлен в None) в верхнем левом и нижнем правом углах макета. Убедитесь, что вы включили эти ложные вершины во все снимки с одинаковыми координатами - это гарантирует, что макеты будут масштабироваться одинаково в каждом снимке в соответствии с указанным ограничивающим прямоугольником.

Если вы не использовали shape атрибут с вашим текущим макетом, обратите внимание, что добавление shape атрибут к поддельным вершинам также добавит shape атрибут (со значением по умолчанию None) к "реальным" вершинам, поэтому вы должны вручную установить shape атрибут всех вершин, кроме двух поддельных "circle",

Другие вопросы по тегам