在 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