Main Content

为图节点和边添加标签

此示例说明如何在图节点和图边上添加和自定义标签。

创建并绘制图

创建表示某个城市中网格化街道和交叉点的图。为边添加权重,使主干道和横穿街道在图中以不同的方式显示。使用与边权重成比例的边线宽绘图。

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);

Figure contains an axes object. The axes object contains an object of type graphplot.

添加节点标签

对于节点数不超过 100 个的图,MATLAB® 会使用数字节点索引或节点名称自动标记节点(更大的图默认情况下将省略这些标签)。但是,您可以通过调整 GraphPlot 对象 PNodeLabel 属性或使用 labelnode 函数来更改节点标签。因此,即使节点具有名称,也可以使用与这些名称不同的标签。

删除默认的数字节点标签。将一个交叉点标记为 Home,将另一个标记为 Work

labelnode(P,1:12,'')
labelnode(P,5,'Home')
labelnode(P,12,'Work')

Figure contains an axes object. The axes object contains an object of type graphplot.

添加边标签

在绘制的图中,边不是自动标记的。您可以通过更改 GraphPlot 对象 PEdgeLabel 属性值或使用 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;

Figure contains an axes object. The axes object contains an object of type graphplot.

调整字体属性

图论图中的节点标签和边标签具有各自的属性,它们控制着标签的外观和样式。由于属性是分离的,因此可以对节点标签和边标签使用不同的样式。

对于节点标签,可以调整:

  • NodeLabel

  • NodeLabelColor

  • NodeFontName

  • NodeFontSize

  • NodeFontWeight

  • NodeFontAngle

对于标签,可以调整:

  • EdgeLabel

  • EdgeLabelColor

  • EdgeFontName

  • EdgeFontSize

  • EdgeFontWeight

  • EdgeFontAngle

使用这些属性,可以调整此示例中纽约市街道使用的字体:

  • 更改 NodeFontSizeNodeLabelColor,使交叉点标签的字体为 12 磅,颜色为红色。

  • 更改 EdgeFontWeightEdgeFontAngleEdgeFontSize,为一个方向的街道使用较大的粗体字体,为另一个方向的街道使用较小的斜体字体。

  • 更改 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';

Figure contains an axes object. The axes object contains an object of type graphplot.

突出显示边

找到 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), '')

Figure contains an axes object. The axes object contains an object of type graphplot.

另请参阅

相关主题