Manually adding plots and legends with a Button Press

조회 수: 7 (최근 30일)
Jason
Jason 2015년 5월 6일
댓글: Joseph Cheng 2015년 5월 7일
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
Jason
Jason 2015년 5월 6일
I've read something about
legend('-DynamicLegend');
(<http://undocumentedmatlab.com/blog/legend-semi-documented-feature>)
But not sure how it works

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

답변 (2개)

Ingrid
Ingrid 2015년 5월 6일
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
Jason
Jason 2015년 5월 6일
편집: Jason 2015년 5월 6일
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 2015년 5월 6일
편집: Jason 2015년 5월 6일
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.

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


Joseph Cheng
Joseph Cheng 2015년 5월 6일
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
Jason
Jason 2015년 5월 7일
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 2015년 5월 7일
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;

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

카테고리

Help CenterFile Exchange에서 Legend에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by