济南建设网站企业报价免费自己开发app软件
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 )。  
 
