В Sage встроено построение графиков с разными краями разных цветов!
См. Необязательные аргументы edge_color
и edge_colors
метода plot
для графиков, перечисленные в таблице параметров построения графиков в Страница «Построение графика» справочного руководства SageMath и приведенный там пример с надписью «Этот пример демонстрирует раскраску краев».
См. Также примеры, иллюстрирующие set_edges
метод графов .
Чтобы проиллюстрировать один из способов достижения запрошенной раскраски, начните с графа Петерсена и пометьте ребра 1, если они соединяют вершины разной четности, и -1 - в противном случае.
sage: g = graphs.PetersenGraph()
sage: for u, v, c in g.edge_iterator():
....: g.set_edge_label(u, v, (u - v) % 2 - (u - v + 1) % 2)
....:
Обратите внимание на результат:
sage: g.edges()
[(0, 1, 1),
(0, 4, -1),
(0, 5, 1),
(1, 2, 1),
(1, 6, 1),
(2, 3, 1),
(2, 7, 1),
(3, 4, 1),
(3, 8, 1),
(4, 9, 1),
(5, 7, -1),
(5, 8, 1),
(6, 8, -1),
(6, 9, 1),
(7, 9, -1)]
Чтобы нарисовать края синим или красным соответственно:
sage: red_edges = [e for e in g.edge_iterator() if e[2] == -1]
sage: g.plot(edge_color='blue', edge_colors={'red': red_edges})
Launched png viewer for Graphics object consisting of 26 graphics primitives
Можно такжесделали:
sage: blue_edges = [e for e in g.edge_iterator() if e[2] != -1]
sage: red_edges = [e for e in g.edge_iterator() if e[2] == -1]
sage: g.plot(edge_colors={'blue': blue_edges, 'red': red_edges})
Launched png viewer for Graphics object consisting of 26 graphics primitives
Остальная часть этого ответа объясняет, как мы могли бы сделать это вручную: создать подграф для каждого цвета ребра, а затем построить эти подграфы вместе.
Чтобы проиллюстрировать это,Начните с графика Петерсена и покрасьте ребра по-разному в зависимости от того, находятся ли они между вершинами одинаковой четности.
sage: g = graphs.PetersenGraph()
sage: a = copy(g) # edges between vertices of different parity
sage: b = copy(g) # edges between vertices of same parity
sage: for u, v, c in g.edge_iterator():
....: if (u - v) % 2:
....: b.delete_edge(u, v)
....: else:
....: a.delete_edge(u, v)
sage: pa = a.plot(axes=False, edge_color='blue')
sage: pb = b.plot(axes=False, edge_color='red')
sage: p = pa + pb
sage: p.show()
Launched png viewer for Graphics object consisting of 37 graphics primitives
Чтобы сохранить график:
sage: p.save('Petersen_graph_by_parity.png')
Для исходной задачи используйте if c == -1
вместо if (u - v) % 2
, чтобы решить, удалять ли ребро из b
или из a
.Кроме того, граф Петерсена поставляется с уже установленными позициями вершин, что может быть не так для графа g
в вопросе, и в этом случае замените две строки, определяющие pa
и pb
, на:
sage: pa = a.plot(axes=False, edge_color='blue', save_pos=True)
sage: pb = b.plot(axes=False, edge_color='red', pos=pa.get_pos())
Этот ответ основан на ответе Тьерри Монтейла на аналогичный вопрос: