Manually adding plots and legends with a Button Press

2 views (last 30 days)
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
Jason on 6 May 2015
I've read something about
legend('-DynamicLegend');
(<http://undocumentedmatlab.com/blog/legend-semi-documented-feature>)
But not sure how it works

Sign in to comment.

Answers (2)

Ingrid
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
Jason
Jason on 6 May 2015
Edited: Jason on 6 May 2015
Hi, its from an edittext field
I now have my code as: legText=get(handles.editLegend,'String')
%txt1=get(legend(gca),'String');
txt1 = handles.tx1;
txt1=['''' txt1 '''' ',' '''' legText '''']
eval(['hleg=legend(' txt1 ')']);Text
handles.txt1 = txt1;
% Update handles structure
guidata(hObject, handles);
and get: Reference to non-existent field 'tx1'.
Error in ZemaxDistortion>pushbuttonTol_Callback (line 661)
txt1 = handles.tx1;
Jason
Jason on 6 May 2015
Edited: Jason on 6 May 2015
Ha, I see a typo here
txt1 = handles.tx1;
OK so I've sort of got it working but its still not right. I have added 2 graphs, names plot 1 and plot 2. But the legend reads
i.e. there is a data 1, data 2 and data 3 from somewhere?. Also the first legend item isn't plot 1.

Sign in to comment.


Joseph Cheng
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
Jason on 7 May 2015
Thansk for this. I actually want the text thats entered in an edit box to be added.
I get the text from the edit box:
legText=get(handles.editLegend,'String')
and then when I change your concatenation line to
legendstr = [legendstr;[legText]];
I get the error
Error using vertcat
Dimensions of matrices being concatenated are not consistent.
Joseph Cheng
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;

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!