Continuous Linking of 2 Plots

3 views (last 30 days)
Hi all,
I have a question concerning "linked" plots:
I have two (sub?) plots. The first one contains data of several variables versus time t with t e [t1,t2]. The second plot displays spectra (absorbance versus wavelength). Each spectrum is specific for a certain point in time tx where again tx e [t1,t2].
My idea now is to link the plots in a way that the time axis position of the mouse pointer in the first plot is processed and used to display the corresponding spectrum at that point of time in the second plot. Interpolation between data points is not necessary.
Do you know an feasible approach to tackle this problem (possibly even an example?)?
Thanks in advance,
bearli

Accepted Answer

Oleg Komarov
Oleg Komarov on 18 Aug 2011
Here's a small GUI, the main part is ln_button and in particular you have to customize what happens at its end, I just plot some random numbers.
keyPressFcn and moveArrow are just there to make it fancy, you don't need to click the graph but you can browse the graph with arrow keys.
Also, you could speed it up by creating a line object s.ln(3) in the first axis, assign it a dummy value and then just substitute the plot with a set(s.ln(3),'Ydata',...,'Xdata',...).
function myGUI
% Figure
s.fh = figure('Units','pixels','Pos',[200 100 800 600],...
'Numbert','off','Menubar','none','KeyPress',@keyPressFcn);
% Two axes
s.a(1) = axes('Units','pixels','Pos',[60 50 680 210]);
s.a(2) = axes('Units','pixels','Pos',[60 350 680 210],'Xlim',[1,100]);
% Line object in first axis
s.ln(1) = line(1:100,(.1:.1:10) + rand(1,100),...
'lines','none','marker','.','markers',5,...
'markere','k','buttond',{@ln_buttond});
% Additional enlarged marker to highlight selected point
s.ln(2) = line(-1,-1,'lines','none','marker','o',...
'markere','r','markers',5);
% ln_buttond --------------------------------------------------------------
function ln_buttond(varargin)
XY = get(s.ln(1),{'Xdata','Ydata'});
% If mouse click
if isempty(varargin{end})
cpaxes = get(s.a(2),'currentpoint');
idx = abs(cpaxes(1) - XY{1}) < .5;
else
idx = varargin{end};
end
% Set marker
set(s.ln(2),'Ydata',XY{2}(idx),'Xdata',XY{1}(idx));
% Plot on first axis (from the bottom)
plot(s.a(1),rand(100,1),rand(100,1))
end
% keyPressFcn -------------------------------------------------------------
function keyPressFcn(varargin)
% Parse Keyboard Inputs
switch upper(varargin{2}.Key)
case 'LEFTARROW'
moveArrow(-1)
case 'RIGHTARROW'
moveArrow(+1)
end
end
% moveArrow ---------------------------------------------------------------
function moveArrow(step)
% Retrieve pos of red marker and maxX
X = get(s.ln(2),'Xdata');
X = X + step;
% Retrieve Xlim
Xlimits = get(s.a(2),'Xlim');
% Crossed Xlimits
if X >= Xlimits(1) && X <= Xlimits(2)
ln_buttond(X)
end
end
end
  1 Comment
Bearli Ubuku
Bearli Ubuku on 19 Aug 2011
Excellent! I'll try to implement it this weekend.

Sign in to comment.

More Answers (0)

Categories

Find more on Specifying Target for Graphics Output in Help Center and File Exchange

Products

Community Treasure Hunt

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

Start Hunting!