그래프 플로팅과 사용자 지정
이 예제에서는 그래프를 플로팅한 후 표시를 사용자 지정하여 레이블을 추가하거나 그래프 노드와 그래프 간선을 강조 표시하는 방법을 보여줍니다.
그래프 플로팅 객체
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 ... ] (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
그래프를 만들고 플로팅하기
한 변이 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 ... ] (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