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