图的可视化 ¶
图的可视化¶
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)
将绘图保存到文件¶
使用 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)
然后,您可以根据需要通过 ax 和 fig 变量(或您调用的任何变量)进一步操作轴和图形。此变体不直接使用 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 通过 Cairo 和 matplotlib 后端支持 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 格式)以及转换为流行的图形库,例如 networkx 和 graph-tool
>>> dot = g.write('/myfolder/myfile.dot')
>>> n = g.to_networkx()
>>> gt = g.to_graph_tool()
如果导出到文件,则无需安装任何库,但需要它们才能直接转换为外部 Python 对象(networkx、graph-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'],
... )
有关示例和选项的完整列表,请参见教程。