グラフのプロットおよびカスタマイズ
この例では、グラフをプロットしたうえで表示をカスタマイズし、グラフのノードとエッジにラベルや強調表示を追加する方法を示します。
グラフ プロット用のオブジェクト
関数 plot
を使用して graph
および digraph
オブジェクトをプロットします。既定では、plot
はグラフのサイズとタイプを確認してどのレイアウトを使用するかを判断します。結果の Figure ウィンドウには、軸目盛りは含まれていません。ただし、XData
、YData
または 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
オブジェクトの XData
、YData
および 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
の右上隅を部分グラフとして抽出し、プロットします。そうすることでグラフの詳細が読み取りやすくなります。新しいグラフ H
は G
から変数 NodeColors
と LWidths
を継承するため、以前に行ったプロットのカスタマイズは簡単に再作成されます。しかし、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 個を超えるグラフを処理する際に次の調整を行います。
グラフ レイアウトの既定のメソッドは常に
'subspace'
となります。ノードは、自動ではラベル付けされなくなります。
MarkerSize
プロパティは、2
に設定されます。(より小規模なグラフでは、マーカー サイズは4
となります)。有向グラフの
ArrowSize
プロパティは4
に設定されます (より小規模な有向グラフでは、矢印サイズは7
が使用されます)。
参考
graph
| digraph
| plot
| GraphPlot