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

ノード ラベルの追加

100 個以下のノードをもつグラフに、MATLAB® は数値ノード インデックスまたはノード名を使用してノードに自動的にラベルを付けます (比較的大規模なグラフでは、既定でラベルが省略されます)。ただし、GraphPlot オブジェクト PNodeLabel プロパティを調整するか、関数 labelnode を使用して、ノード ラベルを変更できます。したがって、ノードに名前があっても、名前と異なるラベルを使用できます。

既定の数値ノード ラベルを削除します。ある交差点に Home というラベルを付け、別の交差点に Work というラベルを付けます。

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

エッジのラベルの追加

プロットされたグラフ内のエッジにラベルが自動的に付けられることは "ありません"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 つだけです。したがって、各エッジの目的の道路名を取得するには、道路名を 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 を変更します。

  • EdgeFontWeightEdgeFontAngle および 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), '')

参考

関連するトピック