在 SageMath 中的图中的顶点上绘制非单射标签
Plotting non-injective labels on vertices in a graph in SageMath
我有一个图,其顶点由一些对 (a,b) 标记。
我能否以只看到第一个组件“a”打印在每个顶点上的方式绘制它?
我不能只是重新标记,因为我的地图 (a,b)->a 不是单射的。
举个小例子,拿
G = Graph()
G.add_edge((1,1),(1,2))
通常的G.plot()
给出(1,1)---(1,2)。
相反,如何只生产 1---1 ?
绘制一个带有非内射顶点 labal 的 Sage 图
我们描述了一个稍微乏味的解决方法,然后
恢复舒适的方法。
顶点的新 class
一个解决方案是为顶点编写一个新的 class
继承自 tuple
并具有自定义 __str__
方法
returns 一个仅代表元组中第一个条目的字符串。
class MyVertex(tuple):
r"""
Class for vertices for special plotting of graphs.
Use with tuples, and only the first entry in the tuple
will be used as a vertex label when plotting the graph.
"""
def __init__(self, v):
self.vertex = v
def __str__(self):
return str(self.vertex[0])
用它来定义图的顶点,
我们获得了所需的行为。
定义一个图并添加一条从(1, 1)
到(1, 2)
的边:
sage: G = Graph()
sage: G.add_edge(MyVertex((1, 1)), MyVertex((1, 2)))
绘制图形时,两个顶点都有标签 1
。
sage: G.plot()
Launched png viewer for Graphics object consisting of 4 graphics primitives
列出顶点时,它们仍然完整显示:
sage: G.vertices()
[(1, 1), (1, 2)]
使用常用图表
为了避免必须显式使用 MyVertex
,我们编写了一个绘图
创建普通图形的中间“MyVertex”样式副本的函数
为了图谋。
def plot_graph(G):
r"""
Return a plot of this graph with special vertex labels.
The graph vertices are assumed to be tuples. The plot
uses the first component of each tuple as a vertex label.
"""
E = [(MyVertex(a), MyVertex(b)) for (a, b) in G.edges(labels=False)]
return Graph(E).plot()
现在比较:
sage: G = graphs.Grid2dGraph(3, 4)
sage: G.plot()
Launched png viewer for Graphics object consisting of 30 graphics primitives
sage: plot_graph(G)
Launched png viewer for Graphics object consisting of 30 graphics primitives
我有一个图,其顶点由一些对 (a,b) 标记。 我能否以只看到第一个组件“a”打印在每个顶点上的方式绘制它? 我不能只是重新标记,因为我的地图 (a,b)->a 不是单射的。
举个小例子,拿
G = Graph()
G.add_edge((1,1),(1,2))
通常的G.plot()
给出(1,1)---(1,2)。
相反,如何只生产 1---1 ?
绘制一个带有非内射顶点 labal 的 Sage 图
我们描述了一个稍微乏味的解决方法,然后 恢复舒适的方法。
顶点的新 class
一个解决方案是为顶点编写一个新的 class
继承自 tuple
并具有自定义 __str__
方法
returns 一个仅代表元组中第一个条目的字符串。
class MyVertex(tuple):
r"""
Class for vertices for special plotting of graphs.
Use with tuples, and only the first entry in the tuple
will be used as a vertex label when plotting the graph.
"""
def __init__(self, v):
self.vertex = v
def __str__(self):
return str(self.vertex[0])
用它来定义图的顶点, 我们获得了所需的行为。
定义一个图并添加一条从(1, 1)
到(1, 2)
的边:
sage: G = Graph()
sage: G.add_edge(MyVertex((1, 1)), MyVertex((1, 2)))
绘制图形时,两个顶点都有标签 1
。
sage: G.plot()
Launched png viewer for Graphics object consisting of 4 graphics primitives
列出顶点时,它们仍然完整显示:
sage: G.vertices()
[(1, 1), (1, 2)]
使用常用图表
为了避免必须显式使用 MyVertex
,我们编写了一个绘图
创建普通图形的中间“MyVertex”样式副本的函数
为了图谋。
def plot_graph(G):
r"""
Return a plot of this graph with special vertex labels.
The graph vertices are assumed to be tuples. The plot
uses the first component of each tuple as a vertex label.
"""
E = [(MyVertex(a), MyVertex(b)) for (a, b) in G.edges(labels=False)]
return Graph(E).plot()
现在比较:
sage: G = graphs.Grid2dGraph(3, 4)
sage: G.plot()
Launched png viewer for Graphics object consisting of 30 graphics primitives
sage: plot_graph(G)
Launched png viewer for Graphics object consisting of 30 graphics primitives