在igraph图中添加标题和图例

时间:2013-08-15 10:19:54

标签: python igraph

在igraph for python中,你可以为一个情节添加一个图例和标题吗?就我所见,手册或教程中都没有提到。但是在R中是可能的。

1 个答案:

答案 0 :(得分:6)

R提供了一个非常先进的绘图系统,R界面只是简单地使用它,这就是为什么你可以简单地在R中创建绘图标题和图例。默认情况下,Python不提供任何绘图,所以igraph使用开罗库绘制图形图。但是,开罗“只是”一个通用的矢量图形库。这就是为什么你没有在Python中获得相同的高级绘图功能。

igraph的plot函数在背景中创建一个Plot对象,将绘制的图形添加到绘图本身,为其创建适当的Cairo曲面,然后开始绘制图形。开罗表面。如果你只是用图形作为参数调用plot,所有这些都会在幕后发生。但是,您可以手动创建Plot对象,然后在绘制之前为其添加标签,如下所示:

>>> plot = Plot("plot.png", bbox=(600, 600), background="white")

此时,您有一个plot变量,它是igraph.drawing.Plot的一个实例。该图由开罗图像表面支持,该图像表面宽600像素,高600像素,最终将保存到名为plot.png的字段中。 (您也可以直接在Plot构造函数的第一个参数中提供Cairo表面)。调用plot.redraw()会绘制情节,但尚未保存。如果尚未绘制,则调用plot.save()将绘制绘图,然后将其保存为给定的文件名。

然后你可以用情节做两件事:

  1. 将任意对象添加到具有__draw__方法的绘图中。 Graph个对象具有这样的方法,因此您可以将图形添加到绘图中,如下所示:

    >>> g = Graph.GRG(100, 0.2)
    >>> plot.add(g, bbox=(20, 20, 580, 580))
    
  2. 抓住其surface属性以访问绘图完成的Cairo表面,使用此曲面构建Cairo绘图上下文,然后使用绘图上下文直接在Cairo上绘制绘图。 / p>

  3. 第二个选项是我们如何为情节添加标签。幸运的是,igraph在igraph.drawing.text包中提供了一个名为TextDrawer的类,它可以帮助我们解决包装和对齐问题。我们只需要创建一个TextDrawer,然后调用其draw_at方法为给定位置的绘图添加标签:

    >>> import cairo
    >>> context = cairo.Context(plot.surface)
    >>> text_drawer = TextDrawer(context, text="Test label", halign=TextDrawer.LEFT)
    >>> text_drawer.draw_at(x=100, y=100)
    

    TextDrawer将使用Cairo上下文的当前字体绘制标签,因此您必须使用Cairo上下文的set_font_faceset_font_size和相关方法来调整字体用于绘图。

    总而言之,这个例子是这样的:

    from igraph import Graph, Plot
    from igraph.drawing.text import TextDrawer
    import cairo
    
    # Construct the plot
    plot = Plot("plot.png", bbox=(600, 650), background="white")
    
    # Create the graph and add it to the plot
    g = Graph.GRG(100, 0.2)
    plot.add(g, bbox=(20, 70, 580, 630))
    
    # Make the plot draw itself on the Cairo surface
    plot.redraw()
    
    # Grab the surface, construct a drawing context and a TextDrawer
    ctx = cairo.Context(plot.surface)
    ctx.set_font_size(36)
    drawer = TextDrawer(ctx, "Test title", halign=TextDrawer.CENTER)
    drawer.draw_at(0, 40, width=600)
    
    # Save the plot
    plot.save()
    

    该示例将为图添加标题。构建一个传奇更为复杂,但我希望你能够根据这个想法继续前进。可以通过重复调用draw的{​​{1}}或draw_at方法来构建图例的标签(在调用之间TextDrawer调整text属性之后当然)。您可以使用标准的Cairo调用在图例周围绘制一个框。如果要绘制类似于绘制图形时igraph使用的节点形状,也可以使用igraph.drawing.shapes中的节点抽屉类。