I have the following graph:
s = [1 2 3 4 6 7 8 10];
t = [3 3 4 5 7 5 9 11];
G = digraph(s,t);
h = plot(G);
and want to add the following labels to the nodes
schedule = [0 0 1 2 3 1 2 2 3 2 3];
I am struggling to manage this with my basic Matlab knowledge. I want to display the node numbers (here: [1:1:11]) and the corresponding values from the schedule array.

 채택된 답변

Voss
Voss 2022년 12월 6일

1 개 추천

s = [1 2 3 4 6 7 8 10];
t = [3 3 4 5 7 5 9 11];
G = digraph(s,t);
h = plot(G);
% schedule = [0 0 1 2 3 1 2 2 3 2 3];
yd = get(h,'YData');
schedule = max(yd)-min(yd)-yd+1
schedule = 1×11
0 0 1 2 3 1 2 2 3 2 3
text(get(h,'XData')-0.1,yd,string(schedule), ...
'HorizontalAlignment','right', ...
'EdgeColor','k', ...
'FontSize',8)

댓글 수: 4

Anna Schloti
Anna Schloti 2022년 12월 6일
You did a great job, thanks a lot!
But unfortunately this is not the desired result...
My plan is to dynamically write the values from the schedule array to the respective nodes. The graph remains the same each time, the schedule array may change and contain different values depending on the algorithm (e.g. to illustrate the ASAP and ALAP algorithm).
Voss
Voss 2022년 12월 6일
편집: Voss 2022년 12월 6일
Ah, ok. In that case, use schedule as you want to define it:
s = [1 2 3 4 6 7 8 10];
t = [3 3 4 5 7 5 9 11];
G = digraph(s,t);
h = plot(G);
schedule = [0 0 1 2 3 1 2 2 3 2 3];
yd = get(h,'YData');
and return handles to the text objects (t) for subsequent modification:
t = text(get(h,'XData')-0.1,yd,string(schedule), ...
'HorizontalAlignment','right', ...
'EdgeColor','k', ...
'FontSize',8);
% this line is just for demo (to show two plots simultaneously), you don't need it:
copyobj(gca(),figure())
Then you can modify the text strings for new values of schedule as needed:
new_schedule = [9 19 29 21 33 11 2 62 53 42 33];
for ii = 1:numel(t)
set(t(ii),'String',new_schedule(ii));
end
Anna Schloti
Anna Schloti 2022년 12월 12일
Thank you so much! This is exactly what I wanted to do!
Voss
Voss 2022년 12월 12일
You're welcome!

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Maik
Maik 2022년 12월 6일

1 개 추천

% You can use nodenames propertiest of digraph. However the names must be unique
s = [1 2 3 4 6 7 8 10];
t = [3 3 4 5 7 5 9 11];
weights = ones(1,8);
names = {'A' 'B' 'C' 'D' 'E' 'F' 'G 4' 'H 5' '1' '2' '3'};
G = digraph(s,t,weights,names)
G =
digraph with properties: Edges: [8×2 table] Nodes: [11×1 table]
h = plot(G)
h =
GraphPlot with properties: NodeColor: [0 0.4470 0.7410] MarkerSize: 4 Marker: 'o' EdgeColor: [0 0.4470 0.7410] LineWidth: 0.5000 LineStyle: '-' NodeLabel: {'A' 'B' 'C' 'D' 'E' 'F' 'G 4' 'H 5' '1' '2' '3'} EdgeLabel: {} XData: [1 2 1.5000 1.5000 2 2.5000 2.5000 3.5000 3.5000 4.5000 4.5000] YData: [4 4 3 2 1 3 2 2 1 2 1] ZData: [0 0 0 0 0 0 0 0 0 0 0] Show all properties

댓글 수: 1

Anna Schloti
Anna Schloti 2022년 12월 6일
Thanks for the answer, Maik.
I think my problem was misunderstood. I want as a result a graph with several labels at the nodes, so something like here:
Thanks in advance!

댓글을 달려면 로그인하십시오.

카테고리

도움말 센터File Exchange에서 Graph and Network Algorithms에 대해 자세히 알아보기

질문:

2022년 12월 5일

댓글:

2022년 12월 12일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by