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