#python #sage
#python #мудрец
Вопрос:
Я хочу построить график в Sage с ребрами, окрашенными по-разному в зависимости от того, удовлетворяют ли они определенному условию. Ничто в документации, которую я прочитал до сих пор, не содержит информации о раскраске определенного ребра графика.
Я не знаю, какая функция могла бы это сделать, но я настроил код, который я покажу:
for edge in g.edges()
if edge[2] == -1:
edge = ? # not sure how to change color of the edge
Ответ №1:
Построение разных ребер разными цветами встроено в 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())
Этот ответ вдохновлен
Ответ Тьерри Монтейла
на аналогичный вопрос: