В этом примере показано, как добавить и настроить метки на вершинах графика и ребрах.
Создайте график, представляющий улицы с координатной сеткой и пересечения в городе. Добавьте веса в ребра так, чтобы основные проспекты и перекрестные улицы появились по-другому в графике. Постройте график с ширинами линии ребра, пропорциональными весу ребра.
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
{'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), '')