Граф графика с расположением вершин, аналогичный некоторому другому графику - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь построить некоторые графики, и они дополняют друг друга, и я хотел бы, чтобы вершины были в одном месте при их построении. Например, при построении графа цикла с 4 вершинами: 4 vertices cycle graph
Я хотел бы иметь возможность построить его дополняющим (ребра 1-3 и 0-2), имея вершины в одной и той же позиции. Вместо этого, при составлении плана это дополняет, я получаю это 4 vertices complementary graph

Я пытался использовать словарь для позиций, но, поскольку я строю несколько из них с n количеством вершин, это работает только для определенных случаев.

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

Для вашего конкретного случая использования, я думаю, есть хороший метод .complement(), который сохраняет это.

sage: H = graphs.CycleGraph(6)                        
sage: graphics_array([H.plot(),H.complement().plot()])

6 Cycle graph and its complement

Однако вВ общем, вы можете захотеть построить другой график в тех же местах, и

с использованием словаря

действительно то, что вы хотели бы сделать здесь.Более простой пример - ваш первый, но я настроил новый график так, чтобы он больше не являлся дополнением.

sage: G = graphs.CycleGraph(4)
sage: pos_dict = G.get_pos()
sage: pos_dict
{0: (0.0, 1.0), 1: (-1.0, 0.0), 2: (0.0, -1.0), 3: (1.0, 0.0)}

Это рассматриваемый словарь, словарь местоположений.Теперь я создаю новый график и пытаюсь построить его вместе с другим.

sage: G1 = Graph({1: [3,2], 2: [0]})
sage: graphics_array([G.plot(),G1.plot(pos=pos_dict)])

two more graphs

0 голосов
/ 23 апреля 2019

Я нашел рабочее решение для моей проблемы n вершин.Это код:

n = 6

# Don't modify
posi = {}
r = 1

G = Graph()
F = Graph()

for i in [0..(n-1)]:
    for j in [0..(n-1)]:
        if i==(j+1)%n or j==(i+1)%n : 
            G.add_edge( (i ,j) )
F = G.complement()

for i in [0..(n-1)]:
    if n % 2 != 0 and i == 0:
        x=0.5
        y=i
    else:
        if i < n/2:
            x=-0.15 if i%2 !=0 else 0.15 #Avoid consecutive vertices to be in-line
            y=i
        else:
            x=0.85 if i%2 !=0 else 1.15  #Avoid consecutive vertices to be in-line
            y=i-r
            r = r+2
    posi[i] = [x, y]

Результат (также составляя их вместе):
G and !G

Во время написания этого я понял, что есть «кулер»'способы сделать это, но это прекрасно работает.

...