Переупорядочить вершину графа. Стоит заказывать как граф Петерсена - PullRequest
0 голосов
/ 05 мая 2018

У меня есть следующий код:

import networkx

grafoPetersen = {
    1: [2,5,6], 
    2: [3,1,7], 
    3: [4,2,8], 
    4: [5,3,9], 
    5: [1,4,10],
    6: [1,8,9], 
    7:[2,9,10], 
    8: [3,10,6], 
    9: [4,6,7], 
    10: [5,7,8]
}

for k in grafoPetersen:
    grafoPetersen[k].append(-1)
    grafoPetersen[k].append(-2)
grafoPetersen[-1] = list(range(1,11))
grafoPetersen[-2] = list(range(1,11))

rutaHamiltoniana = [8, 3, 4, 5, 10, 7, 2, 1, 6, 9];
g = networkx.Graph()
for k, vs in grafoPetersen.items():
    for v in vs:
        if v in [-1, -2] or k in [-1, -2]:
            continue
        if abs(rutaHamiltoniana.index(k) - rutaHamiltoniana.index(v)) == 1:
            g.add_edge(k,v, color='red', width=1.5)
        else:
            g.add_edge(k,v, color='black', width=0.5)

posicion = networkx.circular_layout(g)
edges = g.edges()
colores = [g[u][v]['color'] for u,v in edges]
anchuras = [g[u][v]['width'] for u,v in edges]
networkx.draw(g, posicion, edges=edges, edge_color=colores, width=anchuras, with_labels = True)

И я получаю вывод как:

Output

Мой график - это график Петерсена, и я хочу показать его как:

Petersen

Но с тем же стилем я установил в первом пикте.

Я пробовал это как:

options = {
    'with_labels': True,
    'node_color': 'black',
    'node_size': 200,
    'width': 3,
}
networkx.draw_shell(g, nlist=[range(5,10), range(5)], **options)

как здесь предлагается: Как показать график, подобный графику Петерсена , но я получаю несколько ошибок.

Есть идеи, как я могу разобрать первый пикт во втором пикте, обслуживающем стили первого пикта?

<ч /> РЕДАКТИРОВАТЬ 1: Вот полный код, как я получаю путь графа Петерсена и рисую его как первый пикт: Гамильтонов путь в алгоритме графа Петерсена

1 Ответ

0 голосов
/ 05 мая 2018

Списки в nlist определяют группировки узлов, которые будут размещены на концентрических окружностях (оболочках). Узлы определяются по их идентификатору, который мы определили в grafoPetersen: 1, 2, ..., 10

networkx.draw_shell(g, nlist=[range(5,10), range(5)])

Этот вызов группирует узлы range(5,10)=[5,6,7,8,9] на одном концентрическом круге и range(5)=[0,1,2,3,4] на втором концентрическом круге. Однако в grafoPetersen не определен ни один узел с идентификатором 0. Кроме того, мы определили узел с идентификатором 10, который не представлен ни одним из двух диапазонов.

Итак, чтобы это исправить, нам нужно исправить диапазоны:

networkx.draw_shell(g, nlist=[range(6,11), range(1,6)])

и со всеми модными вариантами:

networkx.draw_shell(g, nlist=[range(6,11), range(1,6)], edge_color=colors, width=widths)

enter image description here

...