그래프 플로팅과 사용자 지정
이 예제에서는 그래프를 플로팅한 후 표시를 사용자 지정하여 레이블을 추가하거나 그래프 노드와 그래프 간선을 강조 표시하는 방법을 보여줍니다.
그래프 플로팅 객체
plot
함수를 사용하여 graph
객체와 digraph
객체를 플로팅합니다. 기본적으로, plot
은 그래프의 크기와 유형을 검토하여 사용할 레이아웃을 확인합니다. 결과로 나타나는 Figure 창에는 좌표축 눈금이 없습니다. 그러나 XData
, YData
또는 ZData
이름-값 쌍을 사용하여 노드의 (x,y) 좌표를 지정하면 Figure에 좌표축 눈금이 표시됩니다.
노드가 100개 이하인 그래프의 플롯에는 노드 레이블이 자동으로 포함됩니다. 노드 이름이 존재하면 그 이름을 노드 레이블로 사용하고, 그렇지 않으면 숫자형 노드 인덱스를 노드 레이블로 사용합니다.
예를 들어, 버키 볼(Bucky Ball) 인접 행렬을 사용하여 그래프를 만든 후 모든 디폴트 옵션을 사용하여 그래프를 플로팅합니다. 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
그래프를 만들고 플로팅하기
한 변이 12개 노드로 구성된 정사각 그리드에서 생성된 L 모양의 멤브레인을 나타내는 그래프를 만들고 플로팅합니다. 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
그래프 노드 레이아웃 변경하기
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