如何使用igraph python的metamagic类?

2024-06-16 13:10:02 发布

您现在位置:Python中文网/ 问答频道 /正文

igraph的python接口有一个名为metamagic的类,用于收集用于打印的图形参数。我正在使用igraph编写一个模块,当我在文档中发现metamagic时,我几乎开始为此编写自己的包装器函数。但是经过搜索和尝试,仍然不清楚如何使用这些类。如果我为边定义一个AttributeCollectorBase类,如下所示:

class VisEdge(igraph.drawing.metamagic.AttributeCollectorBase):
    width = 0.002
    color = "#CCCCCC44"

那么,有没有一种简单的方法将所有这些参数传递给igraph.plot()函数?或者我只能一个接一个地做,像这样:plot(graph,edge_color=VisEdge(graph.es).color)? 如果我不想用常量参数,而是用自定义函数计算呢?例如,vertex_size与度成正比。AttributeSpecification类的func参数应该这样做,不是吗?但是我还没有看到任何使用它的例子。如果我定义一个AttributeSpecification实例,如下所示:

ds = igraph.drawing.metamagic.AttributeSpecification(name="vertex_size",alt_name="size",default=2,func='degree')

如何将它传递给AtributeCollector,最后传递给plot()?你知道吗


Tags: 函数参数size定义plotgraphcolorfunc
1条回答
网友
1楼 · 发布于 2024-06-16 13:10:02

(把事情放在上下文中:我是igraph的Python接口的作者)。你知道吗

我不确定metamagic包是否适合您。AttributeCollectorBase类的唯一目的是允许igraph中的顶点和边抽屉(请参阅igraph.drawing.vertexigraph.drawing.edge包)以一种简洁的方式定义它们能够作为可视属性处理的顶点和边属性(无需输入太多)。因此,例如,如果您查看igraph.drawing.vertex中的DefaultVertexDrawer类,您可以看到我通过从AttributeCollectorBase派生来构造一个VisualVertexBuilder类,如下所示:

class VisualVertexBuilder(AttributeCollectorBase):
    """Collects some visual properties of a vertex for drawing"""
    _kwds_prefix = "vertex_"
    color = ("red", self.palette.get)
    frame_color = ("black", self.palette.get)
    frame_width = 1.0
    ...

稍后,当DefaultVertexDrawerDefaultGraphDrawer中使用时,我只需按如下方式构造一个VisualVertexBuilder

vertex_builder = vertex_drawer.VisualVertexBuilder(graph.vs, kwds)

其中graph.vs是图的顶点序列(因此顶点生成器可以访问顶点属性),而kwds是传递给plot()的关键字参数集。变量vertex_builder允许我通过编写类似vertex_builder[i].color的内容来检索顶点i的计算有效的视觉属性;这里,VisualVertexBuilder的职责是通过查看顶点并检查其color属性以及查看关键字参数并进行检查来确定有效的颜色是否包含vertex_color。你知道吗

归根结底,AttributeCollectorBase类只有在实现自定义图形、顶点或边抽屉并且希望指定要将哪些顶点属性视为可视属性时,才可能对您有用。如果您只想绘制一个图,并从其他数据中导出该图的可视属性,那么AttributeCollectorBase对您没有任何用处。例如,如果希望顶点的大小与度数成比例,则首选的方法是:

sizes = rescale(graph.degree(), out_range=(0, 10))
plot(graph, vertex_size=sizes)

或者这个:

graph.vs["size"] = rescale(graph.degree(), out_range=(0, 10))
plot(g)

如果您有许多可视属性,最好的方法可能是先将它们收集到字典中,然后将该字典传递给plot();例如:

visual_props = dict(
    vertex_size = rescale(graph.degree(), out_range=(0, 10)),
    edge_width = rescale(graph.es["weight"], out_range=(0, 5), scale=log10)
)
plot(g, **visual_props)

有关详细信息,请参阅rescale函数的文档。如果要将某些顶点特性映射到顶点的颜色,仍然可以使用rescale将特性映射到0-255范围,然后将其舍入到最接近的整数,并在打印时使用调色板:

palette = palettes["red-yellow-green"]
colors = [round(x) for x in rescale(g.degree(), out_range=(0, len(palette)-1))]
plot(g, vertex_color=colors, palette=palette)

相关问题 更多 >