Этот пример показывает, как добавить и настроить метки на вершинах графика и ребрах.
Создайте график, представляющий улицы с координатной сеткой и пересечения в городе. Добавьте веса в ребра так, чтобы основные проспекты и перекрестные улицы появились по-другому в графике. Постройте график с ширинами строки ребра, пропорциональными весу ребра.
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® автоматически маркирует узлы с помощью числовых индексов узла, или имена узла (большие графики не используют эти метки по умолчанию). Однако можно изменить метки узла путем корректировки свойства NodeLabel
объекта GraphPlot
P
или при помощи функции labelnode
. Поэтому, даже если узлы имеют имена, можно использовать метки, которые отличаются от имен.
Удалите числовые метки узла по умолчанию. Маркируйте одно из пересечений как Home
и другой как Work
.
labelnode(P,1:12,'') labelnode(P,5,'Home') labelnode(P,12,'Work')
Ребра в построенной диаграмме не маркированы автоматически. Можно добавить метки ребра путем изменения значения свойства EdgeLabel
объекта GraphPlot
P
или при помощи функции 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
Используйте эти свойства настроить шрифты в этом примере с улицами Нью-Йорка:
Измените NodeFontSize
и NodeLabelColor
так, чтобы перекрестные метки были шрифтом на 12 ПБ и красный.
Измените EdgeFontWeight
, EdgeFontAngle
и EdgeFontSize
, чтобы использовать больший, полужирный шрифт для улиц в одном направлении и меньшем, курсивном шрифте для улиц в другом направлении.
Измените EdgeFontName
, чтобы использовать Times New Roman для меток ребра.
Можно использовать функцию highlight
, чтобы изменить свойства графика подмножества ребер графика. Создайте логический индекс isAvenue
, который является true
для меток ребра, содержащих слово 'Ave'
. Используя этот логический вектор как вход к highlight
, маркируйте все проспекты одним способом и все непроспекты иначе.
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';
Найдите кратчайший путь между Домом и узлами работы и исследуйте, какие улицы находятся на пути. Подсветите узлы и ребра на пути красного цвета и удалите метки ребра для всех ребер, которые не находятся на пути.
[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 array
{'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), '')