그래프 노드와 간선에 레이블 지정하기
이 예제에서는 그래프 노드와 간선에 레이블을 추가하고 사용자 지정하는 방법을 보여줍니다.
그래프를 만들고 플로팅하기
도시의 격자형 도로와 교차로를 나타낸 그래프를 만듭니다. 플롯에서 주 도로와 교차 도로가 서로 다르게 표시되도록 간선에 가중치를 추가합니다. 간선 너비가 간선의 가중치에 비례하도록 그래프를 플로팅합니다.
s = [1 1 2 2 3 4 4 5 5 6 7 7 8 8 9 10 11];
t = [2 4 3 5 6 5 7 6 8 9 8 10 9 11 12 11 12];
weights = [1 5 1 5 5 1 5 1 5 5 1 5 1 5 5 1 1];
G = graph(s,t,weights);
P = plot(G,'LineWidth',G.Edges.Weight);
노드 레이블 추가하기
노드가 100개 이하인 그래프의 경우, MATLAB®은 숫자형 노드 인덱스 또는 노드 이름을 사용하여 자동으로 노드에 레이블을 지정합니다(더 큰 그래프에서는 기본적으로 이러한 레이블을 생략함). 그러나 GraphPlot
객체 P
의 NodeLabel
속성을 조정하거나 labelnode
함수를 사용하여 노드 레이블을 변경할 수 있습니다. 따라서 노드에 이름이 있어도 그 이름과 다른 레이블을 사용할 수 있습니다.
디폴트 숫자형 노드 레이블을 제거합니다. 교차로 중 하나의 레이블을 Home
으로, 또 다른 레이블을 Work
로 지정합니다.
labelnode(P,1:12,'') labelnode(P,5,'Home') labelnode(P,12,'Work')
간선 레이블 추가하기
플로팅된 그래프의 간선에는 자동으로 레이블이 지정되지 않습니다. GraphPlot
객체 P
의 EdgeLabel
속성값을 변경하거나 labeledge
함수를 사용하여 간선 레이블을 추가할 수 있습니다.
뉴욕시의 도로에 간선 레이블을 추가해 보겠습니다. 그래프의 G.Edges
테이블에 간선의 순서가 정의되어 있기 때문에 레이블의 순서도 이 순서에 따라 지정해야 합니다. 간선 이름을 간선 정보 바로 옆에서 확인할 수 있도록 G.Edges
테이블에 직접 간선 레이블을 저장하는 것이 편리합니다.
G.Edges
ans=17×2 table
EndNodes Weight
________ ______
1 2 1
1 4 5
2 3 1
2 5 5
3 6 5
4 5 1
4 7 5
5 6 1
5 8 5
6 9 5
7 8 1
7 10 5
8 9 1
8 11 5
9 12 5
10 11 1
⋮
이 예제에는 17개의 간선이 있지만 고유한 도로 이름은 7개뿐입니다. 따라서 도로 이름을 셀형 배열로 정의한 다음 각 간선에 대해 원하는 도로 이름을 이 셀형 배열의 요소를 참조하여 가져올 수 있습니다. 도로 이름이 포함된 G.Edges
테이블에 변수를 추가해 보겠습니다.
streets = {'8th Ave' '7th Ave' '6th Ave' '5th Ave' ... 'W 20th St' 'W 21st St' 'W 22nd St'}'; inds = [1 5 1 6 7 2 5 2 6 7 3 5 3 6 7 4 4]; G.Edges.StreetName = streets(inds); G.Edges
ans=17×3 table
EndNodes Weight StreetName
________ ______ _____________
1 2 1 {'8th Ave' }
1 4 5 {'W 20th St'}
2 3 1 {'8th Ave' }
2 5 5 {'W 21st St'}
3 6 5 {'W 22nd St'}
4 5 1 {'7th Ave' }
4 7 5 {'W 20th St'}
5 6 1 {'7th Ave' }
5 8 5 {'W 21st St'}
6 9 5 {'W 22nd St'}
7 8 1 {'6th Ave' }
7 10 5 {'W 20th St'}
8 9 1 {'6th Ave' }
8 11 5 {'W 21st St'}
9 12 5 {'W 22nd St'}
10 11 1 {'5th Ave' }
⋮
이러한 도로 이름을 참조할 수 있도록 EdgeLabel
속성을 업데이트합니다.
P.EdgeLabel = G.Edges.StreetName;
글꼴 속성 조정하기
그래프 플롯의 노드 레이블과 간선 레이블에는 레이블의 모양과 스타일을 제어하는 자체 속성이 있습니다. 속성들은 분리되어 있기 때문에 노드 레이블과 간선 레이블에 서로 다른 스타일을 사용할 수 있습니다.
노드 레이블의 경우 다음 속성을 조정할 수 있습니다.
NodeLabel
NodeLabelColor
NodeFontName
NodeFontSize
NodeFontWeight
NodeFontAngle
간선 레이블의 경우에는 다음 속성을 조정할 수 있습니다.
EdgeLabel
EdgeLabelColor
EdgeFontName
EdgeFontSize
EdgeFontWeight
EdgeFontAngle
뉴욕시의 도로를 다루는 이 예제에서 위의 속성들을 사용하여 다음과 같이 글꼴을 조정합니다.
교차로 레이블의 글꼴과 색이 12pt. 및 빨간색이 되도록
NodeFontSize
와NodeLabelColor
를 변경합니다.한 방향의 도로에는 더 크고 굵은 글꼴을, 반대 방향의 도로에는 더 작은 기울임꼴을 사용하도록
EdgeFontWeight
,EdgeFontAngle
,EdgeFontSize
를 변경합니다.간선 레이블에 Times New Roman 글꼴을 사용하도록
EdgeFontName
을 변경합니다.
highlight
함수를 사용하여 일부 그래프 간선의 그래프 속성을 변경할 수 있습니다. 간선 레이블에 단어 'Ave'
가 포함된 경우 true
인 논리형 인덱스 isAvenue
를 생성해 보겠습니다. 이 논리형 벡터를 highlight
에 대한 입력값으로 사용하면 한 방향에서 Avenues가 포함된 모든 도로와 반대 방향에서 Avenues가 포함되지 않은 모든 도로에 레이블이 지정됩니다.
P.NodeFontSize = 12; P.NodeLabelColor = 'r'; isAvenue = contains(P.EdgeLabel, 'Ave'); highlight(P, 'Edges', isAvenue, 'EdgeFontAngle', 'italic', 'EdgeFontSize', 7); highlight(P, 'Edges', ~isAvenue, 'EdgeFontWeight', 'bold', 'EdgeFontSize', 10); P.EdgeFontName = 'Times New Roman';
간선 강조 표시하기
Home 노드와 Work 노드 사이의 최단 경로를 찾고 이 경로에 어떤 도로가 있는지 확인합니다. 경로에 있는 노드와 간선을 빨간색으로 강조 표시하고 경로에 없는 모든 간선의 간선 레이블을 제거합니다.
[path,d,pathEdges] = shortestpath(G,5,12)
path = 1×4
5 6 9 12
d = 11
pathEdges = 1×3
8 10 15
G.Edges.StreetName(pathEdges,:)
ans = 3x1 cell
{'7th Ave' }
{'W 22nd St'}
{'W 22nd St'}
highlight(P,'Edges',pathEdges,'EdgeColor','r') highlight(P,path,'NodeColor','r') labeledge(P, setdiff(1:numedges(G), pathEdges), '')