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.

 Akzeptierte Antwort

Voss
Voss am 6 Dez. 2022

1 Stimme

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 Kommentare

Anna Schloti
Anna Schloti am 6 Dez. 2022
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 am 6 Dez. 2022
Bearbeitet: Voss am 6 Dez. 2022
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 am 12 Dez. 2022
Thank you so much! This is exactly what I wanted to do!
Voss
Voss am 12 Dez. 2022
You're welcome!

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Maik
Maik am 6 Dez. 2022

1 Stimme

% 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 Kommentar

Anna Schloti
Anna Schloti am 6 Dez. 2022
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!

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Graph and Network Algorithms finden Sie in Hilfe-Center und File Exchange

Gefragt:

am 5 Dez. 2022

Kommentiert:

am 12 Dez. 2022

Community Treasure Hunt

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

Start Hunting!

Translated by