Main Content

グラフのプロットおよびカスタマイズ

この例では、グラフをプロットしたうえで表示をカスタマイズし、グラフのノードとエッジにラベルや強調表示を追加する方法を示します。

グラフ プロット用のオブジェクト

関数 plot を使用して graph および digraph オブジェクトをプロットします。既定では、plot はグラフのサイズとタイプを確認してどのレイアウトを使用するかを判断します。結果の Figure ウィンドウには、軸目盛りは含まれていません。ただし、XDataYData または ZData の名前と値のペアを使用してノードの (x,y) 座標を指定すると、Figure には軸目盛りが含まれます。

ノード ラベルは、100 個以下のノードをもつグラフのプロットに自動的に含まれます。ノード名が使用可能な場合は、それがノード ラベルに使用されます。使用できない場合、ラベルは数値のノード インデックスとなります。

たとえば、バッキーボール (C60 構造分子) の隣接行列を使用してグラフを作成し、次にすべての既定のオプションを使用してグラフをプロットします。plot を呼び出して出力引数を指定すると、関数は GraphPlot オブジェクトへのハンドルを返します。次に、このオブジェクトを使用してプロットのプロパティを調整できます。たとえば、エッジの色やスタイル、ノードのサイズと色などを変更できます。

G = graph(bucky);
p = plot(G)

p = 
  GraphPlot with properties:

     NodeColor: [0 0.4470 0.7410]
    MarkerSize: 4
        Marker: 'o'
     EdgeColor: [0 0.4470 0.7410]
     LineWidth: 0.5000
     LineStyle: '-'
     NodeLabel: {1x60 cell}
     EdgeLabel: {}
         XData: [0.1033 1.3374 2.2460 1.3509 0.0019 -1.0591 -2.2901 -2.8275 -1.9881 -0.8836 1.5240 0.4128 0.6749 1.9866 2.5705 3.3263 3.5310 3.9022 3.8191 3.5570 1.5481 2.6091 1.7355 0.4849 0.2159 -1.3293 -1.2235 -2.3934 -3.3302 ... ] (1x60 double)
         YData: [-1.8039 -1.2709 -2.0484 -3.0776 -2.9916 -0.9642 -1.2170 0.0739 1.0849 0.3856 0.1564 0.9579 2.2450 2.1623 0.8879 -1.2600 0.0757 0.8580 -0.4702 -1.8545 -3.7775 -2.9634 -2.4820 -3.0334 -3.9854 -3.2572 -3.8936 -3.1331 ... ] (1x60 double)
         ZData: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

  Use GET to show all properties

GraphPlot オブジェクトへのハンドルを取得した後、ドット インデックスを使用してプロパティ値にアクセスし、あるいはその変更を行います。調整できるプロパティの完全な一覧については、GraphPlot のプロパティを参照してください。

NodeColor の値を 'red' に変更します。

p.NodeColor = 'red';

エッジのライン幅を特定します。

p.LineWidth
ans = 0.5000

グラフの作成およびプロット

1 辺が 12 個のノードの正方形グリッドから構成される L 型膜を表すグラフを作成し、プロットします。GraphPlot オブジェクトへのハンドルを返すよう、plot で出力引数を指定します。

n = 12;
A = delsq(numgrid('L',n));
G = graph(A,'omitselfloops')
G = 
  graph with properties:

    Edges: [130x2 table]
    Nodes: [75x0 table]

p = plot(G)

p = 
  GraphPlot with properties:

     NodeColor: [0 0.4470 0.7410]
    MarkerSize: 4
        Marker: 'o'
     EdgeColor: [0 0.4470 0.7410]
     LineWidth: 0.5000
     LineStyle: '-'
     NodeLabel: {1x75 cell}
     EdgeLabel: {}
         XData: [-2.5225 -2.1251 -1.6498 -1.1759 -0.7827 -2.5017 -2.0929 -1.6027 -1.1131 -0.7069 -2.4678 -2.0495 -1.5430 -1.0351 -0.6142 -2.4152 -1.9850 -1.4576 -0.9223 -0.4717 -2.3401 -1.8927 -1.3355 -0.7509 -0.2292 -2.2479 -1.7828 ... ] (1x75 double)
         YData: [-3.5040 -3.5417 -3.5684 -3.5799 -3.5791 -3.0286 -3.0574 -3.0811 -3.0940 -3.0997 -2.4191 -2.4414 -2.4623 -2.4757 -2.4811 -1.7384 -1.7570 -1.7762 -1.7860 -1.7781 -1.0225 -1.0384 -1.0553 -1.0568 -1.0144 -0.2977 -0.3097 ... ] (1x75 double)
         ZData: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

  Use GET to show all properties

グラフ ノードのレイアウトの変更

関数 layout を使用して、プロット内のグラフ ノードのレイアウトを変更します。さまざまなレイアウト オプションにより、プロットのノード座標が自動的に計算されます。あるいは、GraphPlot オブジェクトの XDataYData および ZData の各プロパティを使って、独自のノード座標を指定することもできます。

既定の 2 次元レイアウト メソッドを使用する代わりに、layout を使用して 'force3' レイアウトを指定します。これは 3 次元の力指向レイアウトです。

layout(p,'force3')
view(3)

比例するノードの色付け

次数に基づきグラフ ノードの色付けを行います。このグラフでは、内側にあるすべてのノードの次数は一様に最大の 4 となっています。グラフの境界上にあるノードの次数は 3 で、角のノードの次数は最小の 2 です。このノードの色付けデータを G.Nodes の変数 NodeColors として保存します。

G.Nodes.NodeColors = degree(G);
p.NodeCData = G.Nodes.NodeColors;
colorbar

重みによるエッジのライン幅

乱数値の整数による重みをいくつかグラフ エッジに追加し、ライン幅が重みに比例するようエッジをプロットします。エッジのライン幅はおよそ 7 より大きくなると煩雑になり始めるため、重みが最大のエッジのライン幅が 7 となるよう、ライン幅をスケーリングします。エッジ幅のデータを G.Edges の変数 LWidths として保存します。

G.Edges.Weight = randi([10 250],130,1);
G.Edges.LWidths = 7*G.Edges.Weight/max(G.Edges.Weight);
p.LineWidth = G.Edges.LWidths;

部分グラフの抽出

G の右上隅を部分グラフとして抽出し、プロットします。そうすることでグラフの詳細が読み取りやすくなります。新しいグラフ HG から変数 NodeColorsLWidths を継承するため、以前に行ったプロットのカスタマイズは簡単に再作成されます。しかし、H のノードは、グラフ内の新しいノード数に合わせて番号が付け直されます。

H = subgraph(G,[1:31 36:41]);
p1 = plot(H,'NodeCData',H.Nodes.NodeColors,'LineWidth',H.Edges.LWidths);
colorbar

ノードおよびエッジのラベル付け

labeledge を使用して、幅が 6 より大きいエッジに 'Large' というラベルを付けます。関数 labelnode はノードのラベル付けと同様の方法で動作します。

labeledge(p1,find(H.Edges.LWidths > 6),'Large')

最短経路の強調表示

部分グラフ H のノード 11 とノード 37 の間の最短経路を検出します。この経路に沿っているエッジを赤で強調表示し、経路上の末端ノードのサイズを大きくします。

path = shortestpath(H,11,37)
path = 1×10

    11    12    17    18    19    24    25    30    36    37

highlight(p1,[11 37])
highlight(p1,path,'EdgeColor','r')

ノード ラベルとカラー バーを削除し、すべてのノードを黒にします。

p1.NodeLabel = {};
colorbar off
p1.NodeColor = 'black';

エッジの重みを無視した別の最短経路を検出します。この経路を緑で強調表示します。

path2 = shortestpath(H,11,37,'Method','unweighted')
path2 = 1×10

    11    12    13    14    15    20    25    30    31    37

highlight(p1,path2,'EdgeColor','g')

大規模なグラフのプロット

何十万、あるいは何百万ものノードやエッジをもつグラフを作成することは珍しくありません。そのため、plot は可読性とパフォーマンスを維持するために、大規模なグラフを少し異なる方法で取り扱います。関数 plot は、ノードが 100 個を超えるグラフを処理する際に次の調整を行います。

  1. グラフ レイアウトの既定のメソッドは常に 'subspace' となります。

  2. ノードは、自動ではラベル付けされなくなります。

  3. MarkerSize プロパティは、2 に設定されます。(より小規模なグラフでは、マーカー サイズは 4 となります)。

  4. 有向グラフの ArrowSize プロパティは 4 に設定されます (より小規模な有向グラフでは、矢印サイズは 7 が使用されます)。

参考

| | |

関連するトピック