Plot_Legend_selecting_curve
7 views (last 30 days)
Show older comments
1)
I have many plots, with used this command i grab name of curves from legend
items{i} = [gca.Children(i).DisplayName];
But this works only for one axes (left or right).
In some plots where i have left and right axes it grabs values only from last - right axes
It is possible to grab names, and work with all curves ?
If i grab the names with using legend app.ListBox.Items = gca.Legend.String;
It grab all names, but still i can work and change values only from last axis, not both (left right)
2)
It is possible from matlab code, make some curves active on figure window.
Now i must push "edit plot arrow" select curve, and worked with this active curve.
It is possible select curves with codes ?
Thanks for help
0 Comments
Answers (1)
Deepak
on 12 Nov 2024 at 9:44
To programmatically collect the display names of all plotted curves, we use “findall” function in MATLAB to get all axes in the figure and iterate over their children, checking for and storing the “DisplayName” property of each plot object. This process ensures that the names of all curves, regardless of their associated y-axis, are captured and displayed. We need to iterate over the “axesHandles” twice, once for the left axis and once for the right axis, and retrieve the display names of the plotted curves.
Here is the sample MATLAB code to accomplish the same:
x = linspace(0, 10, 100);
y1 = sin(x);
y2 = cos(x);
y3 = sin(x) + cos(x);
y4 = sin(x) - cos(x);
figure;
% Plot on the left y-axis
yyaxis left;
plot(x, y1, 'DisplayName', 'Sine Wave', 'LineWidth', 1.5);
hold on;
plot(x, y2, 'DisplayName', 'Cosine Wave', 'LineWidth', 1.5);
% Plot on the right y-axis
yyaxis right;
plot(x, y3, 'DisplayName', 'Sine + Cosine', 'LineWidth', 1.5);
hold on;
plot(x, y4, 'DisplayName', 'Sine - Cosine', 'LineWidth', 1.5);
legend('show');
yyaxis left;
axesHandles = findall(gcf, 'Type', 'axes');
items = {};
for ax = axesHandles'
children = ax.Children;
for i = 1:length(children)
if isprop(children(i), 'DisplayName') && ~isempty(children(i).DisplayName)
items{end+1} = children(i).DisplayName;
end
end
end
yyaxis right;
for ax = axesHandles'
children = ax.Children;
for i = 1:length(children)
if isprop(children(i), 'DisplayName') && ~isempty(children(i).DisplayName)
items{end+1} = children(i).DisplayName;
end
end
end
disp('Curve Names:');
disp(items);
Please see the attached documentation for the functions referenced:
I hope this helps in resolving the issue.
0 Comments
See Also
Categories
Find more on Legend in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!