layout
更改图论图布局
说明
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')
输入参数
method
— 布局方法
'auto'
(默认) | 'circle'
| 'force'
| 'layered'
| 'subspace'
| 'force3'
| 'subspace3'
布局方法,指定为下表中的选项之一。下表还列出了兼容的名称-值对组,可用于进一步优化每一种布局方法。
选项 | 描述 | 特定于布局的名称-值对组 |
---|---|---|
'auto' (默认值) | 根据图的大小和结构自动选择布局方法。 | — |
'circle' | 圆形布局。将图节点放置在以原点为中心、半径为 1 的圆形上。 |
|
'force' | 力导向图布局 [1]。在相邻节点之间使用引力,在远距离节点之间使用斥力。 |
|
'layered' |
| |
'subspace' | 子空间嵌入式布局 [5]。在高维嵌入式子空间中绘制图节点,然后将位置投影回二维。默认情况下,子空间维度是 100 或节点总数(以两者中较小者为准)。 |
|
'force3' | 三维力导向图布局。 |
|
'subspace3' | 三维子空间嵌入式布局。 |
|
示例: 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)
Iterations
— 力导向图布局迭代次数
100
(默认) | 正整数标量
力导向图布局迭代次数,指定为逗号分隔的对组,其中包含 'Iterations'
和正整数标量。
此选项仅当 method
为 'force'
或 'force3'
时才可用。
示例: layout(H,'force','Iterations',250)
数据类型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
WeightEffect
— 边权重对布局的影响效果
'none'
(默认) | 'direct'
| 'inverse'
边权重对布局的影响效果,以逗号分隔的对组形式指定,该对组由 'WeightEffect'
和下表中的值之一组成。如果两个节点之间存在多条边(比如在每个方向具有一条边的有向图中或在多重图中),则在计算 'WeightEffect'
之前将权重相加。
此选项仅当 method
为 'force'
或 'force3'
时才可用。
值 | 描述 |
---|---|
| 边权重不影响布局。 |
| 边长与边权重成正比 |
| 边长与边权重成反比 |
示例: layout(H,'force','WeightEffect','inverse')
UseGravity
— 多分量布局的引力切换
'off'
或 false
(默认) | 'on'
或 true
多分量布局的重力切换,以逗号分隔的对组形式指定,该对组由 'UseGravity'
以及 'off'
、'on'
、true
或 false
组成。值 'on'
等效于 true
,'off'
等效于 false
。
默认情况下,MATLAB® 将包含多个分量的图显示在网格上。网格可能会挡住大分量的细节,因为给予大小分量的空间量是一样的。如果将 'UseGravity'
设置为 'on'
或 true
,则多个分量会围绕原点放射状排列。这种布局以更自然的方式分散放置分量,并为较大的分量提供了更多空间。
此选项仅当 method
为 'force'
或 'force3'
时才可用。
示例: layout(H,'force','UseGravity',true)
数据类型: char
| logical
XStart
— 节点的起始 x 坐标
向量
节点的起始 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
YStart
— 节点的起始 y 坐标
向量
节点的起始 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
ZStart
— 节点的起始 z 坐标
向量
节点的起始 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
Direction
— 层的方向
'down'
(默认) | 'up'
| 'left'
| 'right'
层的方向,指定为逗号分隔的对组,其中包含 'Direction'
和 'down'
、'up'
、'left'
或 'right'
。对于有向无环图 (DAG),箭头指向指示的方向。
此选项仅当 method
为 'layered'
时才可用。
示例: layout(H,'layered','Direction','up')
Sources
— 要包含在第一层中的节点
节点索引 | 节点名称
要包含在第一层中的节点,指定为以逗号分隔的对组,其中包含 'Sources'
以及一个或多个节点索引或节点名称。
下表显示通过数值节点索引或节点名称引用一个或多个节点的不同方法。
形式 | 单一节点 | 多个节点 |
---|---|---|
节点索引 | 标量 示例: | 向量 示例: |
节点名称 | 字符向量 示例: | 字符向量元胞数组 示例: |
字符串标量 示例: | 字符串数组 示例: |
此选项仅当 method
为 'layered'
时才可用。
示例: layout(H,'layered','Sources',[1 3 5])
Sinks
— 要包含在最后一层中的节点
节点索引 | 节点名称
要包含在最后一层中的节点,指定为以逗号分隔的对组,其中包含 'Sinks'
以及一个或多个节点索引或节点名称。
此选项仅当 method
为 'layered'
时才可用。
示例: layout(H,'layered','Sinks',[2 4 6])
AssignLayers
— 层分配方法
'auto'
(默认) | 'asap'
| 'alap'
层分配方法,指定为逗号分隔的对组,其中包含 'AssignLayers'
和下表中的选项之一。
选项 | 描述 |
---|---|
'auto' (默认值) | 节点分配使用 'asap' 或 'alap' ,以两者中更紧凑者为准。 |
'asap' | 尽可能前。在分配节点时,在满足该节点所有前趋节点都必须在其之前的层的约束条件下,将其分配到尽可能靠前的层。 |
'alap' | 尽可能后。在分配节点时,在满足其所有后继节点都必须在其之后的层的约束条件下,将其分配到尽可能后的层。 |
此选项仅当 method
为 'layered'
时才可用。
示例: layout(H,'layered','AssignLayers','alap')
Dimension
— 嵌入式子空间的维度
正整数标量
嵌入式子空间的维度,指定为逗号分隔的对组,其中包含 '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
— 圆形布局的中心节点
节点索引 | 节点名称
圆形布局的中心节点,以逗号分隔的对组形式指定,该对组由 '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'
布局方法时,最佳做法是在算法中使用多次迭代,而不是使用XStart
、YStart
和ZStart
在先前输出的基础上重新启动算法。对算法执行 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 中推出
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)