Main Content

layout

更改图论图布局

说明

示例

layout(H) 通过根据图结构自动选择布局方法更改图论图 H 的布局。layout 函数修改 HXDataYData 属性。

示例

layout(H,method) 可选择性地指定布局方法。method 可以是 'circle''force''layered''subspace''force3''subspace3'

示例

layout(H,method,Name,Value) 使用一个或多个名称-值对组参量指定的其他选项。例如,layout(H,'force','Iterations',N) 指定在计算力导向图布局中要使用的迭代次数,layout(H,'layered','Sources',S) 使用分层布局,其中第一层包含源节点 S

示例

全部折叠

使用 'force' 布局创建并绘制一个图。

s = [1 1 1 1 1 6 6 6 6 6];
t = [2 3 4 5 6 7 8 9 10 11];
G = graph(s,t);
h = plot(G,'Layout','force');

将布局更改为 plot 基于图的结构体和属性确定的默认布局。结果与使用 plot(G) 相同。

layout(h)

使用 'layered' 布局创建并绘制一个图。

s = [1 1 1 2 2 3 3 4 5 5 6 7];
t = [2 4 5 3 6 4 7 8 6 8 7 8];
G = graph(s,t);
h = plot(G,'Layout','layered');

将图布局更改为使用 'subspace' 方法。

layout(h,'subspace')

使用 'layered' 布局方法创建并绘制一个图。

s = [1 1 1 2 3 3 3 4 4];
t = [2 4 5 6 2 4 7 8 1];
G = digraph(s,t);
h = plot(G,'Layout','layered');

使用 layout 函数通过指定源节点和水平方向优化层次结构布局。

layout(h,'layered','Direction','right','Sources',[1 4])

绘制一个包含多个分量的图,然后说明如何使用 'UseGravity' 选项改善可视化效果。

创建并绘制一个图,其中包含 150 个节点,分散在许多未连通分量中。MATLAB® 将图分量显示在网格上。

s = [1 3 5 7 7 10:100];
t = [2 4 6 8 9 randi([10 100],1,91)];
G = graph(s,t,[],150);
h = plot(G);

更新图对象的布局坐标,并将 'UseGravity' 指定为 true,以使分量围绕原点放射状排列,并为较大的分量分配更多空间。

layout(h,'force','UseGravity',true)

使用 'WeightEffect' 名称-值对组绘制一个图,使图中的边长与边权重成正比。

创建并绘制一个具有加权边的有向图。

s = [1 1 1 1 1 2 2 2 3 3 3 3 3];
t = [2 4 5 6 7 3 8 9 10 11 12 13 14];
weights = randi([1 20],1,13);
G = graph(s,t,weights);
p = plot(G,'Layout','force','EdgeLabel',G.Edges.Weight);

使用 'WeightEffect' 名称-值对组重新计算图布局,使每条边的长度与其权重成正比。这使得权重最大的边最长。

layout(p,'force','WeightEffect','direct')

输入参数

全部折叠

输入图论图,指定为 GraphPlot 对象。使用 graphdigraph 函数创建一个图,然后结合使用 plot 与输出参量返回 GraphPlot 对象。

示例: H = plot(G)

布局方法,指定为下表中的选项之一。下表还列出了兼容的名称-值对组,可用于进一步优化每一种布局方法。

选项描述特定于布局的名称-值对组
'auto'(默认值)

根据图的大小和结构自动选择布局方法。

'circle'

圆形布局。将图节点放置在以原点为中心、半径为 1 的圆形上。

'Center' - 圆形布局的中心节点

'force'

力导向图布局 [1]。在相邻节点之间使用引力,在远距离节点之间使用斥力。

'Iterations' - 力导向图布局迭代次数

'WeightEffect' - 边权重对布局的影响效果

'UseGravity' - 多分量布局的引力切换

'XStart' - 节点的起始 x 坐标

'YStart' - 节点的起始 y 坐标

'layered'

分层布局 [2][3][4]。将图节点置于多层中,表示层级结构。默认情况下是逐层向下的(有向无环图的箭头向下)。

'Direction' - 层的方向

'Sources' - 第一层包含的节点

'Sinks' - 最后一层包含的节点

'AssignLayers' - 层分配方法

'subspace'

子空间嵌入式布局 [5]。在高维嵌入式子空间中绘制图节点,然后将位置投影回二维。默认情况下,子空间维度是 100 或节点总数(以两者中较小者为准)。

'Dimension' - 嵌入式子空间的维度

'force3'三维力导向图布局。

'Iterations' - 力导向图布局迭代次数

'WeightEffect' - 边权重对布局的影响效果

'UseGravity' - 多分量布局的引力切换

'XStart' - 节点的起始 x 坐标

'YStart' - 节点的起始 y 坐标

'ZStart' - 节点的起始 z 坐标

'subspace3'三维子空间嵌入式布局。

'Dimension' - 嵌入式子空间的维度

示例: layout(H,'layered')

示例: layout(H,'force3','Iterations',10)

示例: layout(H,'subspace','Dimension',50)

名称-值参数

将可选的参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量之后,但参量对组的顺序无关紧要。

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: layout(H,'subspace','Dimension',200)

Force

全部折叠

力导向图布局迭代次数,指定为逗号分隔的对组,其中包含 'Iterations' 和正整数标量。

此选项仅当 method'force''force3' 时才可用。

示例: layout(H,'force','Iterations',250)

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

边权重对布局的影响效果,以逗号分隔的对组形式指定,该对组由 'WeightEffect' 和下表中的值之一组成。如果两个节点之间存在多条边(比如在每个方向具有一条边的有向图中或在多重图中),则在计算 'WeightEffect' 之前将权重相加。

此选项仅当 method'force''force3' 时才可用。

描述

'none'(默认值)

边权重不影响布局。

'direct'

边长与边权重成正比 G.Edges.Weight。边权重越大,生成的边越长。

'inverse'

边长与边权重成反比 1./G.Edges.Weight。边权重越大,生成的边越短。

示例: layout(H,'force','WeightEffect','inverse')

多分量布局的重力切换,以逗号分隔的对组形式指定,该对组由 'UseGravity' 以及 'off''on'truefalse 组成。值 'on' 等效于 true'off' 等效于 false

默认情况下,MATLAB® 将包含多个分量的图显示在网格上。网格可能会挡住大分量的细节,因为给予大小分量的空间量是一样的。如果将 'UseGravity' 设置为 'on'true,则多个分量会围绕原点放射状排列。这种布局以更自然的方式分散放置分量,并为较大的分量提供了更多空间。

此选项仅当 method'force''force3' 时才可用。

示例: layout(H,'force','UseGravity',true)

数据类型: char | logical

节点的起始 x 坐标,指定为逗号分隔的对组,其中包含 'XStart' 和节点坐标的向量。将此选项与 'YStart' 结合使用,可在力导向图算法的迭代更改节点位置之前指定二维起始坐标,或与 'YStart''ZStart' 结合使用,指定三维起始坐标。

此选项仅当 method'force''force3' 时才可用。

示例: layout(H,'force','XStart',x,'YStart',y)

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

节点的起始 y 坐标,指定为逗号分隔的对组,其中包含 'YStart' 和节点坐标的向量。将此选项与 'XStart' 结合使用,可在力导向图算法的迭代更改节点位置之前指定二维起始坐标,或与 'XStart''ZStart' 结合使用,指定三维起始坐标。

此选项仅当 method'force''force3' 时才可用。

示例: layout(H,'force','XStart',x,'YStart',y)

示例: layout(H,'force','XStart',x,'YStart',y,'ZStart',z)

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

节点的起始 z 坐标,指定为逗号分隔的对组,其中包含 'ZStart' 和一个节点坐标向量。将此选项与 'XStart''YStart' 结合使用,可在力导向图算法的迭代更改节点位置之前指定节点的起始 x、y 和 z 坐标。

此选项仅当 method'force3' 时才可用。

示例: layout(H,'force','XStart',x,'YStart',y,'ZStart',z)

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Layered

全部折叠

层的方向,指定为逗号分隔的对组,其中包含 'Direction''down''up''left''right'。对于有向无环图 (DAG),箭头指向指示的方向。

此选项仅当 method'layered' 时才可用。

示例: layout(H,'layered','Direction','up')

要包含在第一层中的节点,指定为以逗号分隔的对组,其中包含 'Sources' 以及一个或多个节点索引或节点名称。

下表显示通过数值节点索引或节点名称引用一个或多个节点的不同方法。

形式单一节点多个节点
节点索引

标量

示例:1

向量

示例:[1 2 3]

节点名称

字符向量

示例:'A'

字符向量元胞数组

示例:{'A' 'B' 'C'}

字符串标量

示例:"A"

字符串数组

示例:["A" "B" "C"]

此选项仅当 method'layered' 时才可用。

示例: layout(H,'layered','Sources',[1 3 5])

要包含在最后一层中的节点,指定为以逗号分隔的对组,其中包含 'Sinks' 以及一个或多个节点索引或节点名称。

此选项仅当 method'layered' 时才可用。

示例: layout(H,'layered','Sinks',[2 4 6])

层分配方法,指定为逗号分隔的对组,其中包含 'AssignLayers' 和下表中的选项之一。

选项描述
'auto'(默认值)节点分配使用 'asap''alap',以两者中更紧凑者为准。
'asap'尽可能前。在分配节点时,在满足该节点所有前趋节点都必须在其之前的层的约束条件下,将其分配到尽可能靠前的层。
'alap'尽可能后。在分配节点时,在满足其所有后继节点都必须在其之后的层的约束条件下,将其分配到尽可能后的层。

此选项仅当 method'layered' 时才可用。

示例: layout(H,'layered','AssignLayers','alap')

Subspace

全部折叠

嵌入式子空间的维度,指定为逗号分隔的对组,其中包含 'Dimension' 和一个正整数标量。

  • 默认整数值为 min([100, numnodes(G)])

  • 对于 'subspace' 布局,该整数必须大于或等于 2。

  • 对于 'subspace3' 布局,该整数必须大于或等于 3。

  • 在这两种情况下,该整数都必须小于节点数。

此选项仅当 method'subspace''subspace3' 时才可用。

示例: layout(H,'subspace','Dimension',d)

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

圆圈

全部折叠

圆形布局的中心节点,以逗号分隔的对组形式指定,该对组由 'Center' 和下表中的值之一组成。

示例
标量节点索引1
字符向量节点名称'A'
字符串标量节点名称"A"

此选项仅当 method'circle' 时才可用。

示例: layout(H,'circle','Center',3) 将节点 3 放在中心位置。

示例: layout(H,'circle','Center','Node1') 将名为 'Node1' 的节点放在中心位置。

提示

  • 绘制图形时,可使用 Layout 名称-值对组更改图形的布局。例如,plot(G,'Layout','circle') 使用圆形布局绘制图 G

  • 使用 'force''force3' 布局方法时,最佳做法是在算法中使用多次迭代,而不是使用 XStartYStartZStart 在先前输出的基础上重新启动算法。对算法执行 100 次迭代的结果不同于先执行 50 次迭代,然后从结束位置重新启动算法继续执行 50 次迭代。

参考

[1] Fruchterman, T., and E. Reingold,. “Graph Drawing by Force-directed Placement.” Software — Practice & Experience. Vol. 21 (11), 1991, pp. 1129–1164.

[2] Gansner, E., E. Koutsofios, S. North, and K.-P Vo. “A Technique for Drawing Directed Graphs.” IEEE Transactions on Software Engineering. Vol.19, 1993, pp. 214–230.

[3] Barth, W., M. Juenger, and P. Mutzel. “Simple and Efficient Bilayer Cross Counting.” Journal of Graph Algorithms and Applications. Vol.8 (2), 2004, pp. 179–194.

[4] Brandes, U., and B. Koepf. “Fast and Simple Horizontal Coordinate Assignment.” LNCS. Vol. 2265, 2002, pp. 31–44.

[5] Y. Koren. “Drawing Graphs by Eigenvectors: Theory and Practice.” Computers and Mathematics with Applications. Vol. 49, 2005, pp. 1867–1888.

版本历史记录

在 R2015b 中推出