如何在python-graph中使用ArrowEdgeDrawer绘制箭头边缘?

时间:2015-04-06 14:01:53

标签: python graph plot igraph

我想绘制一个图表,显示使用python-graph将图形转换为另一个图形。所以我需要一个从第一个图表指向第二个图表的箭头。我正在考虑使用ArrowEdgeDrawer类,但我无法找到如何正确使用它。任何人都可以为我提供创建和使用ArrowEdgeDrawer对象的演示,我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

ArrowEdgeDrawer并不意味着用于在绘图上绘制任意箭头;顾名思义,它是一个 edge 抽屉。默认情况下,图形抽屉类使用ArrowEdgeDrawer将无向边绘制为直线,将有向边绘制为带箭头的线,因此ArrowEdgeDrawer的公共方法将两个图顶点作为参数而不是绘图上的任意点。以一种非常复杂的方式,您可能可能创建一个"假的"包含两个不可见顶点(顶点形状= "none")和它们之间的有向边的图形,然后将这个图形覆盖在实际图形的顶部,但我认为直接在绘图画布上绘制要容易得多。 igraph使用Cairo作为绘图后端,您可以使用适当构造的surface对象的Plot属性访问igraph图的Cairo表面。然后,您可以为曲面创建Cairo绘图上下文并直接在其上绘制。例如:

from igraph import Graph, Plot
from cairo import Context

# Create two graphs
g = Graph.Ring(5)
g2 = Graph.Full(5)

# Create a figure containing the two graphs
fig = Plot("test.pdf", bbox=(800, 360), background="white")
fig.add(g, bbox=(20,20,340,340))
fig.add(g2, bbox=(460,20,780,340))

# Force the figure to be drawn
fig.redraw()

# Create a Cairo drawing context
ctx = Context(fig.surface)

# Draw an arrow
ctx.set_source_rgb(0,0,0)
ctx.move_to(360,180)
ctx.line_to(430,180)
ctx.stroke()
ctx.move_to(440,180)
ctx.line_to(430,170)
ctx.line_to(430,190)
ctx.line_to(440,180)
ctx.fill()

# Save the figure
fig.save()