Маркируйте графовые узлы и ребра

В этом примере показано, как добавить и настроить метки на узлах графика и ребрах.

Создайте и постройте график

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

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);

Figure contains an axes. The axes contains an object of type graphplot.

Добавление меток узлов

Для графиков с 100 или менее узлами MATLAB ® автоматически помечает узлы с помощью числовых индексов узлов или имен узлов (большие графы опускают эти метки по умолчанию). Однако можно изменить метки узлов, скорректировав NodeLabel свойство GraphPlot P объекта или при помощи labelnode функция. Поэтому, даже если узлы имеют имена, можно использовать метки, отличающиеся от имен.

Удалите метки числовых узлов по умолчанию. Пометьте одно из пересечений следующим Home и другой, как Work.

labelnode(P,1:12,'')
labelnode(P,5,'Home')
labelnode(P,12,'Work')

Figure contains an axes. The axes contains an object of type graphplot.

Добавление меток ребер

Кромки построенной диаграммы не помечаются автоматически. Можно добавить ребра метки, изменив значение 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;

Figure contains an axes. The axes contains an object of type graphplot.

Настройка свойств шрифта

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

Для меток узлов можно настроить:

  • 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';

Figure contains an axes. The axes contains an object of type graphplot.

Подсветка ребер

Найдите кратчайший путь между узлами 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), '')

Figure contains an axes. The axes contains an object of type graphplot.

См. также

Похожие темы