在igraph for python中,你可以为一个情节添加一个图例和标题吗?就我所见,手册或教程中都没有提到.但是在R中是可能的.
R提供了一个非常先进的绘图系统,R界面只是简单地使用它,这就是为什么你可以简单地用R创建绘图标题和图例.默认情况下,Python不提供任何绘图,所以igraph使用Cairo库绘制图形图.但是,开罗"只是"一个通用的矢量图形库.这就是为什么你没有在Python中获得相同的高级绘图功能.
plotigraph 的功能Plot在背景中创建一个对象,将绘制的图形添加到绘图本身,为其创建适当的Cairo曲面,然后开始在Cairo曲面上绘制图形.如果您只是plot使用图形作为参数调用,所有这些都会在幕后发生.但是,您可以Plot手动创建对象,然后在绘制之前为其添加标签,如下所示:
>>> plot = Plot("plot.png", bbox=(600, 600), background="white")
Run Code Online (Sandbox Code Playgroud)
此时,您有一个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))
Run Code Online (Sandbox Code Playgroud)抓取其surface属性以访问绘图完成的Cairo表面,使用此曲面构建Cairo绘图上下文,然后使用绘图上下文直接在Cairo上绘制绘图.
第二个选项是我们如何为图添加标签.幸运的是,igraph提供了一个TextDrawer在igraph.drawing.text包中命名的类,它可以帮助我们解决包装和对齐问题.我们只需要创建一个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)
Run Code Online (Sandbox Code Playgroud)
在TextDrawer将提请标签与开罗上下文的当前字体,所以你必须使用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()
Run Code Online (Sandbox Code Playgroud)
该示例将为图添加标题.构建一个传奇更为复杂,但我希望你能够根据这个想法继续前进.可以通过重复调用a draw或draw_at方法来构造图例的标签TextDrawer(当然,在调整之间的调用text属性之后TextDrawer).您可以使用标准的Cairo调用在图例周围绘制一个框.igraph.drawing.shapes如果要绘制与绘制图形时igraph使用的节点形状类似的节点形状,也可以使用节点抽屉类.