1.修改現有圖的節點和邊
????????此示例演示如何使用 addedge 、 rmedge 、 addnode 、 rmnode 、 findedge 、 findnode 及 subgraph 函數訪問和修改 graph 或 digraph 對象中的節點和/或邊。
1.1 添加節點
????????創建一個包含四個節點和四條邊的圖。s 和 t 中的對應元素用于指定每條圖邊的結束節點。
s = [1 1 1 2];
t = [2 3 4 3];
G = graph(s,t)
G =
graph with properties:
Edges: [4x1 table]
Nodes: [4x0 table]
????????查看圖的邊列表。
G.Edges
ans=4×1 table
EndNodes
________
1 2
1 3
1 4
2 3
????????使用 addnode 向圖中添加五個節點。該命令將添加五個節點 ID 分別為 5 、 6 、 7 、 8 和 9 的不相連節點。
G = addnode(G,5)
G =
graph with properties:
Edges: [4x1 table]
Nodes: [9x0 table]
1.2 刪除節點
????????使用 rmnode 從圖中刪除節點 3、5 和 6。與其中一個已刪除節點相連的所有邊也會被刪除。對圖中剩余的六個節點重新進行編號,以反映新的節點數量。
G = rmnode(G,[3 5 6])
G =
graph with properties:
Edges: [2x1 table]
Nodes: [6x0 table]
1.3 添加邊
????????使用 addedge 向 G 添加兩條邊。第一條邊位于節點 1 和節點 5 之間,第二條邊位于節點 2 和節點 5 之間。該命令將向 G.Edges 添加兩個新行。
G = addedge(G,[1 2],[5 5])
G =
graph with properties:
Edges: [4x1 table]
Nodes: [6x0 table]
1.4 刪除邊
????????使用 rmedge 刪除節點 1 和節點 3 之間的邊。該命令將從 G.Edges 中刪除一個行。
G = rmedge(G,1,3)
G =
graph with properties:
Edges: [3x1 table]
Nodes: [6x0 table]
1.5 確定邊索引
????????確定節點 1 和 5 之間的邊的邊索引。邊索引 ei 是 G.Edges 中的行號。
ei = findedge(G,1,5)
ei = 2
1.6 確定節點索引
????????在圖中添加節點名稱,然后確定節點 'd' 的節點索引。數值節點索引 ni 是 G.Nodes 中的行號。使用其他圖函數(例如 shortestpath )時,可以同時使用 ni 和節點名稱 'd' 來表示節點。
G.Nodes.Name = { 'a' 'b' 'c' 'd' 'e' 'f' }';
ni = findnode(G, 'd' )
ni = 4
1.7 提取子圖
????????使用 subgraph 提取僅包含兩個節點的圖部分。
H = subgraph(G,[1 2])
H =
graph with properties:
Edges: [1x1 table]
Nodes: [2x1 table]
????????查看子圖的邊列表。
H.Edges
ans=table
EndNodes
______________
{'a'} {'b'}
1.8 通過變量編輯器修改節點和邊表格
????????圖對象的節點和邊信息包含在 Nodes 和 Edges 這兩個屬性中。這兩個屬性都是包含變量的表,用于說明圖中的節點和邊的特性。由于 Nodes 和 Edges 都是表,因此您可以使用變量編輯器以交互方式查看或編輯這些表。您不能使用變量編輯器添加或刪除節點或邊,也不能編輯 Edges 表的 EndNodes 屬性。變量編輯器適用于管理 Nodes 和 Edges 表中的額外節點和邊屬性。
2.添加圖節點名稱、邊權重和其他屬性
????????此示例演示如何向使用 graph 和 digraph 創建的圖中的節點和邊添加屬性。當您最初調用 graph 或digraph 來創建圖時,可以指定節點名稱或邊權重。但是,此示例演示了如何在創建圖后向圖添加屬性。
2.1 創建圖
????????創建一個有向圖。s 和 t 中的對應元素用于定義圖中每條邊的源節點和目標節點。
s = [1 1 2 2 3];
t = [2 4 3 4 4];
G = digraph(s,t)
G =
digraph with properties:
Edges: [5x1 table]
Nodes: [4x0 table]
2.2 添加節點名稱
????????通過將變量 Name 添加到 G.Nodes 表中來向圖中添加節點名稱。 Name 變量必須指定為 N × 1 字符向量元胞數組或字符串數組,其中 N = numnodes(G) 。添加節點名稱時請務必使用 Name 變量,因為該變量名稱會被一些圖函數進行特殊處理。
G.Nodes.Name = { 'First' 'Second' 'Third' 'Fourth' }';
????????查看新的 Nodes 表。
G.Nodes
ans=4×1 table
Name
__________
{'First' }
{'Second'}
{'Third' }
{'Fourth'}
????????使用表索引查看節點 1 和 4 的名稱。
G.Nodes.Name([1 4])
ans = 2x1 cell
{'First' }
{'Fourth'}
2.3 添加邊權重
????????通過將變量 Weight 添加到 G.Edges 表中來向圖添加邊權重。 Weight 變量必須是 M×1 數值向量,其中 M = numedges(G) 。添加邊權重時請務必使用 Weight 變量,因為該變量名稱會被一些圖函數進行特殊處理。
G.Edges.Weight = [10 20 30 40 50]';
????????查看新的 Edges 表。
G.Edges
ans=5×2 table
EndNodes Weight
________________________ ______
{'First' } {'Second'} 10
{'First' } {'Fourth'} 20
{'Second'} {'Third' } 30
{'Second'} {'Fourth'} 40
{'Third' } {'Fourth'} 50
????????使用表索引查看 G.Edges 的第一行和第三行。
G.Edges([1 3],:)
ans=2×2 table
EndNodes Weight
________________________ ______
{'First' } {'Second'} 10
{'Second'} {'Third' } 30
2.4 添加自定義屬性
????????原則上,您可以將任何變量添加到 G.Nodes 和 G.Edges 中,來定義圖節點或邊的屬性。添加自定義屬性很有用,因為 subgraph 和 reordernodes 之類的函數可以保留圖屬性。例如,可以向 G.Edges 添加名為 Power 的變量,來指示每條邊是 'on' 還是 'off'。G.Edges.Power = { 'on' 'on' 'on' 'off' 'off' }';
G.Edges
ans=5×3 table
EndNodes Weight Power
________________________ ______ _______
{'First' } {'Second'} 10 {'on' }
{'First' } {'Fourth'} 20 {'on' }
{'Second'} {'Third' } 30 {'on' }
{'Second'} {'Fourth'} 40 {'off'}
{'Third' } {'Fourth'} 50 {'off'}
????????向 G.Nodes 添加名為 Size 的變量,來指示每個節點的實際大小。
G.Nodes.Size = [10 20 10 30]';
G.Nodes
ans=4×2 table
Name Size
__________ ____
{'First' } 10
{'Second'} 20
{'Third' } 10
{'Fourth'} 30
2.5?為圖論圖的節點和邊添加標簽
????????繪制圖時,您可以使用 G.Nodes 和 G.Edges 中的變量為圖節點和邊添加標簽。這種做法很方便,因為已經確保這些變量具有正確數量的元素。
????????繪制圖,并使用 G.Edges 中的 Power 變量為邊添加標簽。使用 G.Nodes 中的 Size 變量為節點添加標簽。
p = plot(G, 'EdgeLabel' ,G.Edges.Power, 'NodeLabel' ,G.Nodes.Size)

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: {'10' '20' '10' '30'}
EdgeLabel: {'on' 'on' 'on' 'off' 'off'}
XData: [2 1.5000 1 2]
YData: [4 3 2 1]
ZData: [0 0 0 0]
Show all properties
3.圖的繪制和自定義
????????此示例演示如何繪制圖,然后自定義顯示內容以向圖節點和邊添加標簽或高亮顯示。
3.1 繪圖對象
????????使用 plot 函數繪制 graph 和 digraph 對象。默認情況下, plot 會檢查圖的大小和類型,以確定要使用的布局。生成的圖窗窗口不包含軸刻度線。但是,如果使用 XData 、 YData 或 ZData 名稱-值對組指定節點的 (x,y) 坐標,圖窗將包含軸刻度線。
????????節點數不超過 100 的圖會自動包含節點標簽。節點標簽使用節點名稱(如果可用);否則標簽為數值節點索引。
????????例如,使用巴基球鄰接矩陣創建一個圖,然后使用所有的默認選項繪制該圖。如果您調用 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 -2.4370 2.4601 ... ]
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 -2.2357 -2.4880 ... ]
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]
Show all properties
????????獲得 GraphPlot 對象的句柄后,便可以使用點索引訪問或更改屬性值。有關您可以調整的屬性的完整列表,請參閱 GraphPlot 屬性。將 NodeColor 的值更改為 'red' 。
p.NodeColor = 'red' ;
????????確定邊的線寬。
p.LineWidth
ans = 0.5000
3.2 創建并繪制圖
????????創建并繪制一個表示 L 形膜的圖,L 形膜是基于一側有 12 個節點的方形網格構建的。使用 plot 指定輸出參數以返回 GraphPlot 對象的句柄。
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 -1.1871 -0.5239 ... ]
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 -0.3229 -0.3152 ... ]
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]
Show all properties
3.3 更改圖節點的布局
????????使用 layout 函數更改繪圖中的圖節點的布局。不同的布局選項會自動計算繪圖的節點坐標。或者,可以使用 GraphPlot 對象的 XData 、 YData 和 ZData 屬性來指定您自己的節點坐標。不使用默認的二維布局方法,而是使用 layout 來指定 'force3' 布局(三維力導向圖布局)。
layout(p, 'force3' )
view(3)

3.4 按比例對節點著色
????????根據圖節點的出入度為它們著色。在該圖中,所有內部節點都具有最大度數 4,沿圖邊的節點的度數為 3,角節點具有最小度數 2。將該節點著色數據存儲為 G.Nodes 中的變量 NodeColors 。
G.Nodes.NodeColors = degree(G);
p.NodeCData = G.Nodes.NodeColors;
colorbar

3.5 按權重列出的邊線寬度
????????向圖邊添加一些隨機整數權重,然后繪制這些邊,使它們的線寬與權重成比例。由于約大于 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;
3.6 提取子圖
????????提取 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
3.7 為節點和邊添加標簽
????????使用 labeledge 對寬度大于 6 的邊添加標簽 'Large' 。 labelnode 函數以相似的方式為節點添加標簽。
labeledge(p1,find(H.Edges.LWidths > 6), 'Large' )
3.8 突出顯示最短路徑
????????查找子圖 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' )
3.9 繪制大圖
????????創建包含數十萬個甚至數百萬個節點和/或邊的圖是很常見的。為此,plot 處理大圖會略有不同,以保持可讀性和性能。處理節點超過 100 個的圖時, plot 函數會進行以下調整:
1 默認的圖布局方法始終為 'subspace' 。
2 不會再自動為這些節點添加標簽。
3 MarkerSize 屬性設置為 2 。(較小的圖的標記大小為 4 )。
4 有向圖的 ArrowSize 屬性設置為 4 。(較小的有向圖使用的箭頭大小為 7 )。
?
?