为图节点和边添加标签
此示例说明如何在图节点和图边上添加和自定义标签。
创建并绘制图
创建表示某个城市中网格化街道和交叉点的图。为边添加权重,使主干道和横穿街道在图中以不同的方式显示。使用与边权重成比例的边线宽绘图。
s = [1 1 2 2 3 4 4 5 5 6 7 7 8 8 9 10 11];
t = [2 4 3 5 6 5 7 6 8 9 8 10 9 11 12 11 12];
weights = [1 5 1 5 5 1 5 1 5 5 1 5 1 5 5 1 1];
G = graph(s,t,weights);
P = plot(G,'LineWidth',G.Edges.Weight);
添加节点标签
对于节点数不超过 100 个的图,MATLAB® 会使用数字节点索引或节点名称自动标记节点(更大的图默认情况下将省略这些标签)。但是,您可以通过调整 GraphPlot
对象 P
的 NodeLabel
属性或使用 labelnode
函数来更改节点标签。因此,即使节点具有名称,也可以使用与这些名称不同的标签。
删除默认的数字节点标签。将一个交叉点标记为 Home
,将另一个标记为 Work
。
labelnode(P,1:12,'') labelnode(P,5,'Home') labelnode(P,12,'Work')
添加边标签
在绘制的图中,边不是自动标记的。您可以通过更改 GraphPlot
对象 P
的 EdgeLabel
属性值或使用 labeledge
函数来添加边标签。
为纽约市的街道添加边标签。边的顺序在图的 G.Edges
表中定义,因此您指定的标签顺序必须遵循该顺序。将边标签直接存储在 G.Edges
表中很方便,这样边名称就位于其他边信息的旁边。
G.Edges
ans=17×2 table
EndNodes Weight
________ ______
1 2 1
1 4 5
2 3 1
2 5 5
3 6 5
4 5 1
4 7 5
5 6 1
5 8 5
6 9 5
7 8 1
7 10 5
8 9 1
8 11 5
9 12 5
10 11 1
⋮
下面的示例有 17 条边,但只有 7 个唯一的街道名称。因此,可以在元胞数组中定义街道名称,然后对元胞数组进行索引,以检索每条边需要的街道名称。将变量添加到包含街道名称的 G.Edges
表中。
streets = {'8th Ave' '7th Ave' '6th Ave' '5th Ave' ... 'W 20th St' 'W 21st St' 'W 22nd St'}'; inds = [1 5 1 6 7 2 5 2 6 7 3 5 3 6 7 4 4]; G.Edges.StreetName = streets(inds); G.Edges
ans=17×3 table
EndNodes Weight StreetName
________ ______ _____________
1 2 1 {'8th Ave' }
1 4 5 {'W 20th St'}
2 3 1 {'8th Ave' }
2 5 5 {'W 21st St'}
3 6 5 {'W 22nd St'}
4 5 1 {'7th Ave' }
4 7 5 {'W 20th St'}
5 6 1 {'7th Ave' }
5 8 5 {'W 21st St'}
6 9 5 {'W 22nd St'}
7 8 1 {'6th Ave' }
7 10 5 {'W 20th St'}
8 9 1 {'6th Ave' }
8 11 5 {'W 21st St'}
9 12 5 {'W 22nd St'}
10 11 1 {'5th Ave' }
⋮
更新 EdgeLabel
属性,以引用这些街道名称。
P.EdgeLabel = G.Edges.StreetName;
调整字体属性
图论图中的节点标签和边标签具有各自的属性,它们控制着标签的外观和样式。由于属性是分离的,因此可以对节点标签和边标签使用不同的样式。
对于节点标签,可以调整:
NodeLabel
NodeLabelColor
NodeFontName
NodeFontSize
NodeFontWeight
NodeFontAngle
对于边标签,可以调整:
EdgeLabel
EdgeLabelColor
EdgeFontName
EdgeFontSize
EdgeFontWeight
EdgeFontAngle
使用这些属性,可以调整此示例中纽约市街道使用的字体:
更改
NodeFontSize
和NodeLabelColor
,使交叉点标签的字体为 12 磅,颜色为红色。更改
EdgeFontWeight
、EdgeFontAngle
和EdgeFontSize
,为一个方向的街道使用较大的粗体字体,为另一个方向的街道使用较小的斜体字体。更改
EdgeFontName
,使用 Times New Roman 作为边标签。
可以使用 highlight
函数更改图边子集的图属性。创建逻辑索引 isAvenue
,对于包含单词 'Ave'
的边标签,逻辑索引的值为 true
。使用此逻辑向量作为 highlight
的输入,以一种方式标记所有主干道,以另一种方式标记所有非主干道。
P.NodeFontSize = 12; P.NodeLabelColor = 'r'; isAvenue = contains(P.EdgeLabel, 'Ave'); highlight(P, 'Edges', isAvenue, 'EdgeFontAngle', 'italic', 'EdgeFontSize', 7); highlight(P, 'Edges', ~isAvenue, 'EdgeFontWeight', 'bold', 'EdgeFontSize', 10); P.EdgeFontName = 'Times New Roman';
突出显示边
找到 Home 和 Work 节点之间的最短路线,并检查哪些街道在该路线上。以红色突出显示该路线上的节点和边,并删除不在该路线上的所有边的边标签。
[path,d,pathEdges] = shortestpath(G,5,12)
path = 1×4
5 6 9 12
d = 11
pathEdges = 1×3
8 10 15
G.Edges.StreetName(pathEdges,:)
ans = 3x1 cell
{'7th Ave' }
{'W 22nd St'}
{'W 22nd St'}
highlight(P,'Edges',pathEdges,'EdgeColor','r') highlight(P,path,'NodeColor','r') labeledge(P, setdiff(1:numedges(G), pathEdges), '')