如何将图形中的边缘着色为特定颜色

问题描述 投票:1回答:1

我想在Sage中绘制一个图形,边缘根据它们是否满足某个条件而有不同的颜色。到目前为止,我所阅读的文档中没有任何内容包含有关着色图形特定边缘的信息。

我不知道什么功能可以做到这一点,但我已经设置了代码,我将展示:

for edge in g.edges()
    if edge[2] == -1:
        edge = ? # not sure how to change color of the edge
python sage
1个回答
0
投票

Sage内置了不同颜色的不同边缘!

请参阅edge_color图表绘制选项表中列出的edge_colors图表方法的plot"Graph plotting" page of the SageMath reference manual可选参数,以及“此示例显示边缘着色”的示例。

另请参阅说明the set_edges method of graphs的示例。

为了说明实现所请求着色的一种方法,从Petersen图开始,如果它们连接不同奇偶校验的顶点,则将边标记为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

本答案的其余部分解释了我们如何手动完成这项工作:为每种边缘颜色创建一个子图,然后将这些子图绘制在一起。

为了说明这一点,从Petersen图开始,并根据它们是否在相同奇偶校验的顶点之间而对颜色边进行不同的着色。

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删除边。此外,Petersen图表已经设置了顶点位置,这可能不适用于问题中的图形g,在这种情况下,用以下方法替换定义papb的两条线:

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

这个答案的灵感来自Thierry Monteil's answer对类似的问题:

© www.soinside.com 2019 - 2024. All rights reserved.