Маркировка 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), '')

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

Похожие темы

Была ли эта тема полезной?