Маркировка Graph Nodes и Edges

Этот пример показывает, как добавить и настроить метки на вершинах графика и ребрах.

Создание и Построение графа

Создайте график, представляющий улицы с координатной сеткой и пересечения в городе. Добавьте веса в ребра так, чтобы основные проспекты и перекрестные улицы появились по-другому в графике. Постройте график с ширинами строки ребра, пропорциональными весу ребра.

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), '')

Смотрите также

Похожие темы