在igraph for python中,你可以为一个情节添加一个图例和标题吗?就我所见,手册或教程中都没有提到。但是在R中是可能的。
答案 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()
将绘制绘图,然后将其保存为给定的文件名。
然后你可以用情节做两件事:
将任意对象添加到具有__draw__
方法的绘图中。 Graph
个对象具有这样的方法,因此您可以将图形添加到绘图中,如下所示:
>>> g = Graph.GRG(100, 0.2)
>>> plot.add(g, bbox=(20, 20, 580, 580))
抓住其surface
属性以访问绘图完成的Cairo表面,使用此曲面构建Cairo绘图上下文,然后使用绘图上下文直接在Cairo上绘制绘图。 / p>
第二个选项是我们如何为情节添加标签。幸运的是,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_face
,set_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
中的节点抽屉类。