python-igraph 手册

用于从 Python 使用 igraph

图的可视化

图的可视化

igraph 包含可视化图的功能。主要有两个组成部分:图布局和图绘制。

在以下示例中,我们将假设 igraph 导入为 ig,并且先前已创建 Graph 对象,例如:

>>> import igraph as ig
>>> g = ig.Graph(edges=[[0, 1], [2, 3]])

阅读 API 文档 以获取有关每个函数和类的详细信息。 教程 包含入门示例。

图布局

布局是图的低维(通常:2 维)表示。可以计算同一图的不同布局,并且通常保留或突出显示图本身的独特属性。一些布局仅对特定类型的图有意义,例如树。

igraph 提供了几种图布局。计算图布局的通用函数是 Graph.layout()

>>> layout = g.layout(layout='auto')

请参阅下面的支持布局列表。结果对象是 igraph.layout.Layout 的一个实例,并具有一些有用的属性

  • Layout.coords:布局中顶点的坐标(每行是一个顶点)

  • Layout.dim:嵌入的维度数(通常为 2)

和方法

  • Layout.boundaries() 具有布局极端坐标的矩形

  • Layout.bounding_box() 边界,但作为 igraph.drawing.utils.BoundingBox(参见下文)

  • Layout.centroid() 图布局的质心坐标

可以执行索引和切片,并返回请求的顶点的坐标

>>> coords_subgraph = layout[:2]  # Coordinates of the first two vertices

注意

返回的对象是具有坐标的列表的列表,而不是 igraph.layout.Layout 对象。您可以轻松地将结果包装到这样的对象中

>>> layout_subgraph = ig.Layout(coords=layout[:2])

可以对布局执行线性变换

  • Layout.translate()

  • Layout.center()

  • Layout.scale()

  • Layout.fit_into()

  • Layout.rotate()

  • Layout.mirror()

以及通过以下方式的通用非线性变换

  • Layout.transform()

支持以下常规布局

  • Graph.layout_star:星形布局

  • Graph.layout_circle:圆形/球形布局

  • Graph.layout_grid:2D 中的规则网格布局

  • Graph.layout_grid_3d:3D 中的规则网格布局

  • Graph.layout_random:随机布局(2D 和 3D)

以下算法为通用图生成漂亮的布局

  • Graph.layout_davidson_harel:Davidson-Harel 布局,基于模拟退火优化,包括边交叉

  • Graph.layout_drl:用于大型图的 DrL 布局(2D 和 3D),一种可扩展的力导向布局

  • Graph.layout_fruchterman_reingold:Fruchterman-Reingold 布局(2D 和 3D),一种基于经典物理学的“弹簧-电”布局

  • Graph.layout_graphopt:graphopt 算法,另一种力导向布局

  • Graph.layout_kamada_kawai:Kamada-Kawai 布局(2D 和 3D),一种基于经典物理学的“弹簧”布局

  • Graph.layout_lgl:大型图布局

  • Graph.layout_mds:多维缩放布局

  • Graph.layout_umap:统一流形逼近和投影(2D 和 3D)。当图由松散连接在一起的“簇”组成时,UMAP 特别有效。

以下算法对(以及 Sugiyama 有向无环图DAG)很有用

  • Graph.layout_reingold_tilford:Reingold-Tilford 布局

  • Graph.layout_reingold_tilford_circular:圆形 Reingold-Tilford 布局

  • Graph.layout_sugiyama:Sugiyama 布局,一种分层布局

对于二分图,有一个专用函数

  • Graph.layout_bipartite:二分图布局

将来可能会根据请求添加更多。

图绘制

计算出图的布局后,igraph 可以辅助绘制本身。绘制发生在一个函数中,igraph.plot

使用默认图像查看器进行绘制

igraph.plot 的裸调用生成一个临时文件,并使用默认图像查看器打开它

>>> ig.plot(g)

(如果您在 Jupyter notebook 中使用此方法,请参见下文)。这在幕后使用了 Cairo 库。

将绘图保存到文件

使用 target 参数调用 igraph.plot 会将图图像存储在指定的文件中,并且不会自动打开它。根据文件名扩展名,可以选择以下任何输出格式:PNG、PDF、SVG 和 PostScript

>>> ig.plot(g, target='myfile.pdf')

注意

PNG 是一种光栅图像格式,而 PDF、SVG 和 Postscript 是矢量图像格式。如果您计划使用矢量图像编辑器(例如 Inkscape 或 Illustrator)来优化图像,请选择后三种格式之一。

在 Matplotlib 图形中绘制图

如果 target 参数是 matplotlib 轴,则该图将绘制在该轴内部

>>> import matplotlib.pyplot as plt
>>> fig, ax = plt.subplots()
>>> ig.plot(g, target=ax)

然后,您可以根据需要通过 axfig 变量(或您调用的任何变量)进一步操作轴和图形。此变体不直接使用 Cairo,并且可能缺少 Cairo 后端中可用的一些功能:请在 Github 上提出问题以请求特定功能。

通过 matplotlib 绘图可以轻松地将 igraph 与其他绘图组合在一起。例如,如果您想要一个包含两个面板的图形,其中显示某个数据集的不同方面,例如图和条形图,则可以轻松地做到这一点

>>> import matplotlib.pyplot as plt
>>> fig, axs = plt.subplots(1, 2, figsize=(8, 4))
>>> ig.plot(g, target=axs[0])
>>> axs[1].bar(x=[0, 1, 2], height=[1, 5, 3], color='tomato')

另一种常见的情况是在事后修改图绘图,以实现某种自定义。例如,您可能想要更改顶点的大小和颜色

>>> import matplotlib.pyplot as plt
>>> fig, ax = plt.subplots()
>>> ig.plot(g, target=ax)
>>> dot = ax.get_children()[0] # This is a Circle for the first vertex
>>> dot.set_color('tomato')
>>> dot.radius *= 2 # double the default radius

如果您无法弄清楚如何使用下面的绘图选项,这也很有帮助:只需使用默认值,然后通过标准 matplotlib 工具自定义图形的外观。

注意

ax.get_children() 的顺序如下:(i) 如果请求,则为聚类外壳的补丁;(ii) 顶点的补丁;(iii) 边的补丁:对于无向图,每条边都有一个补丁。对于有向图,有一补丁,分别与箭头主体和头部相关联。

要使用 matplotlib_ 作为默认绘图后端,您可以设置

>>> ig.config['plotting.backend'] = 'matplotlib'

然后,您不必再指定 Axes

>>> ig.plot(g)

将自动为您创建一个新的 Axes 并将其返回。

在 Jupyter notebook 中绘制图

igraph 通过 Cairomatplotlib 后端支持 Jupyter notebook 中的内联绘图。如果您从没有 matplotlib 轴的 notebook 单元格调用 igraph.plot,则图像将内联显示在相应的输出单元格中。使用 bbox 参数缩放图像,同时保留顶点、文本和其他艺术家的尺寸。例如,要获得紧凑的绘图

>>> ig.plot(g, bbox=(0, 0, 100, 100))

这些内联绘图可以是 PNG 或 SVG 格式。目前存在一个未解决的错误,如果每个 notebook 绘制多个图,则 SVG 会失败:我们正在努力修复该错误。在此期间,您可以使用 PNG 表示。

如果您想在 Jupyter notebook 中使用 matplotlib 引擎,可以使用上面的方法。首先创建一个轴,然后通过 target 参数告诉 igraph.plot

>>> import matplotlib.pyplot as plt
>>> fig, ax = plt.subplots()
>>> ig.plot(g, target=ax)

导出到其他图形格式

如果 igraph 缺少某个绘图功能,并且您无法等待我们包含它,您可以随时将图形导出为多种格式,并使用外部图形绘图工具。我们支持转换为文件(例如,graphviz 使用的 DOT 格式)以及转换为流行的图形库,例如 networkxgraph-tool

>>> dot = g.write('/myfolder/myfile.dot')
>>> n = g.to_networkx()
>>> gt = g.to_graph_tool()

如果导出到文件,则无需安装任何库,但需要它们才能直接转换为外部 Python 对象(networkxgraph-tool)。

绘图选项

您可以向 plot 函数添加一个参数 layout 以指定预先计算的布局,例如

>>> layout = g.layout("kamada_kawai")
>>> ig.plot(g, layout=layout)

也可以直接使用布局算法的名称

>>> ig.plot(g, layout="kamada_kawai")

如果布局未指定,则 igraph 使用专用的 layout_auto() 函数,该函数根据顶点和边的数量在几种可能的布局中进行选择。

您还可以通过其他参数指定顶点和边的颜色、大小和标签等,例如

>>> ig.plot(g,
...         vertex_size=20,
...         vertex_color=['blue', 'red', 'green', 'yellow'],
...         vertex_label=['first', 'second', 'third', 'fourth'],
...         edge_width=[1, 4],
...         edge_color=['black', 'grey'],
...         )

有关示例和选项的完整列表,请参见教程