Как раскрасить ребро на графике в определенный цвет

#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())
 

Этот ответ вдохновлен
Ответ Тьерри Монтейла
на аналогичный вопрос: