Manually adding plots and legends with a Button Press
Show older comments
I have a button call back that I want to plot a set of data in a particular colour and add the legend. I then want to be able to press the button and each time a different data set is plotted in a different colour and its legend text to match the colour.
I First count the number of times the button has been pressed (its initially set to 1)
nplts=getappdata(0,'NominalPlotcount')
%Then I define the colour of my plot depending on this value.
nplts=getappdata(0,'NominalPlotcount')
switch nplts
case 1
colour='r'
case 2
colour='b'
case 3
colour='g'
case 4
colour='k'
otherwise
colour='r'
end
I then perform the plot and increment my plot counter nplts, and add the legend.
plot(x,N(:,1),colour,'MarkerSize', 4, 'Marker','o','LineWidth',1)
legText=get(handles.editLegend,'String');
legend(legText)
setappdata(0,'NominalPlotcount',nplts+1);
My legend doesn't concatenate to whats already there. I have tried
txt1=get(legend(gca),'String');
txt1=[txt1,legText];
hleg=legend(txt1);
But this just adds all the legend items in a single colour. Im really stuck now, any suggestions please?
Thanks Jason
1 Comment
Jason
on 6 May 2015
Answers (2)
Ingrid
on 6 May 2015
if I understand your question correctly this should work, since you need to be placing brackets around each legend entry for matlab to interpret it is separate entries and hence assign a different colour
txt1=get(legend(gca),'String');
txt1=['''' txt1 '''' ',' '''' legText '''']
eval(['hleg=legend(' txt1 ')']);
6 Comments
Ingrid
on 6 May 2015
because ' is required to define a string so you need two ' to define an apostrophe in a string and you need one apostrophe before and one after to define that it is a string (I know, complicated, but that's the way to work with strings in Matlab)
the error of cell type is probably because you get txt1 from the current legend. I think it is better if you store the txt1 each time in the handles structure so that you can use the correct format
so
txt1 = handles.txt1; % for this you first need to initialize an empty txt1 in the OpeningFcn of your gui
txt1=['''' txt1 '''' ',' '''' legText ''''];
eval(['hleg=legend(' txt1 ')']);
handles.txt1 = txt1;
% Update handles structure
guidata(hObject, handles);
Jason
on 6 May 2015
you are still getting the current legend for txt1 (second line in your code) instead of using
txt1 = handles.tx1;
to set the value of txt1;
also it is not clear how you obtain the legText, is this from an editText field or is it a user defined field?
Joseph Cheng
on 6 May 2015
why not try something like this out
clc; clear all;
nplts = 0;
legendstr = [];
figure(1),hold on;
cont = input('plot another rand plot?: ','s');
while ~isempty(cont)
nplts = nplts+1;
switch mod(nplts,5)
case 1
colour='r'
case 2
colour='b'
case 3
colour='g'
case 4
colour='k'
otherwise
colour='r'
end
plot(randi(1000,1,100),colour),legend('show');
hlegend = findobj(gcf,'Type','axes','Tag','legend');
legendstr = [legendstr;['another plot ' num2str(nplts)]];
% legendstr =get(legend(gca),'String');
legend(legendstr)
cont = input('plot another rand plot?: ','s');
end
2 Comments
Jason
on 7 May 2015
Joseph Cheng
on 7 May 2015
well you would then convert what you want into a cell array which is a few edits to the example code of:
legendstr = {}; %note the { brackets
%and then down below
legendstr(nplts) = %user input text;
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!