如何使用igraph python的metamagic类?

时间:2014-06-13 14:12:48

标签: python igraph

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与度数成比例。 func类的AttributeSpecification参数应该这样做,不是吗?但我还没有看到任何使用它的例子。如果我定义AttributeSpecification实例,就像这样:

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

如何将其传递给AtributeCollector,最后传递给plot()

1 个答案:

答案 0 :(得分:2)

(把事情放在上下文中:我是igraph的Python界面的作者)。

我不确定metamagic包是否适合您。 AttributeCollectorBase类的唯一目的是允许igraph中的顶点和边抽屉(参见igraph.drawing.vertexigraph.drawing.edge包)来定义它们能够处理的顶点和边缘属性视觉属性以简洁明了的方式(没有我必须输入太多)。因此,例如,如果您查看DefaultVertexDrawer中的igraph.drawing.vertex类,您可以看到我通过从VisualVertexBuilder派生AttributeCollectorBase类来构建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 ... 类,如下所示:

DefaultVertexDrawer

稍后,当DefaultGraphDrawer中使用VisualVertexBuilder时,我只需按如下方式构建vertex_builder = vertex_drawer.VisualVertexBuilder(graph.vs, kwds)

graph.vs

其中kwds是图的顶点序列(因此顶点构建器可以访问顶点属性),plot()是传递给vertex_builder的关键字参数集。 i变量允许我通过写vertex_builder[i].color之类的东西来检索顶点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) ; e.g:

rescale

有关更多详细信息,请查看rescale函数的文档。如果要将某些顶点属性映射到顶点的颜色,仍然可以使用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) 将属性映射到0-255范围,然后将它们四舍五入到最接近的整数并在绘图时使用调色板: / p>

{{1}}