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()
?
答案 0 :(得分:2)
(把事情放在上下文中:我是igraph的Python界面的作者)。
我不确定metamagic
包是否适合您。 AttributeCollectorBase
类的唯一目的是允许igraph中的顶点和边抽屉(参见igraph.drawing.vertex
和igraph.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}}