Как раскрасить ребро на графике как определенный цвет - PullRequest
1 голос
/ 20 апреля 2019

Я хочу построить график в Sage с краями, окрашенными по-разному в зависимости от того, соответствуют ли они определенному условию.Ничто в документации, которую я до сих пор читал, не содержит информации о раскраске определенного края графа.

Я не знаю, какая функция могла бы это сделать, но я настроил код, который я покажу:

for edge in g.edges()
    if edge[2] == -1:
        edge = ? # not sure how to change color of the edge

1 Ответ

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

В 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

Petersen graph colored by parity

Можно такжесделали:

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

Petersen graph colored by parity

Чтобы сохранить график:

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

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

...