グラフのノードとエッジにラベルを付ける
この例では、グラフのノードとエッジのラベルを追加およびカスタマイズする方法を示します。
グラフの作成およびプロット
都市のグリッド道路および交差点を表すグラフを作成します。主要な大通りと交差路がプロット内で異なって表示されるように重みをエッジに追加します。エッジのライン幅がエッジの重みに比例するようにグラフをプロットします。
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 つだけです。したがって、各エッジの目的の道路名を取得するには、道路名を cell 配列で定義し、cell 配列にインデックスを付けることが理に適っています。道路名を含む 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
これらのプロパティを使用し、ニューヨーク市の道路の含まれる例で、フォントを調整します。
交差点のラベルのフォントが赤色の 12 ポイントになるように
NodeFontSize
およびNodeLabelColor
を変更します。EdgeFontWeight
、EdgeFontAngle
およびEdgeFontSize
を変更し、一方の方向の道路にはさらに大きな太字フォントを、他方の方向の道路にはイタリック フォントを使用します。EdgeFontName
を変更し、エッジのラベルに Times New Roman を使用します。
関数 highlight
を使用して、グラフ エッジのサブセットのグラフ プロパティを変更できます。単語 'Ave'
を含むエッジのラベルに対して true
の論理インデックス isAvenue
を作成します。この logical ベクトルを 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), '')