% uilineshift()
% function to shift a selected line (or all other outputs of the PLOT-function) in X and Y-direction
% RATIONALE
% =====================
% this function might be useful for quick and dirty visual inspection of multiple
% traces or timecourses with a timedelay between or arbitrary x/y-axes or illconditioned overlay
% of traces
% - works for all outputs of the 'plot-function' (type is 'line'). Note, plotet dots are also of type line.
% - The function adds an icon in the menubar of a figure, which than
% activates the shift-function
% - if the function is active, a line can be selected and moved within the axis as long as the
% mousebutton is not released
% - right mouse button (contextmenu): get the original plot (as long as the icon in the menubar is
% not deactivated)
% =====================
% HOW TO DO:
% 1]
% plot(something);%plot something
% uilineshift; %adds icon in menubar
% OR 2]
% uilineshift; %adds icon in menubar
% now plot something
% =====================
% EXAMPLE:
% uilineshift('test'); %3 examples
% ----------------------------------------------------------------------
% Paul S. Koch, BNIC Berlin 2009
% ----------------------------------------------------------------------
function uilineshift(varargin)
% uilineshift('test');
% *******************************************************
% *******************************************************
%examples
% ==========================
if nargin==1
if strcmp(varargin{1},'test')
% uilineshift(2);
% uilineshift(3);
uilineshift(1);
end
if varargin{1}==1
figure('color','w');hold on
% plot([1:5],'linewidth',3,'marker','o');
% plot([1:2],9:10,'linewidth',3,'marker','o','color','r');
subplot(2,2,[3 4]);
hold on
a=hanning(20);
imp=round(rand(10,1)*100);
rest=round(rand(10,1)*100);
x=[];
for i=1:length(imp)
tp=[zeros(rest(i),1); ones(imp(i),1) ];
x(end+1:end+length(tp),1)=tp;
end
x=x+(rand(size(x,1),1)./3);
y=conv(x,a);
%figure('color','w');hold on
plot( 1:length(x), ((x)-mean(x))./std(x), 'color','k', 'linewidth',1.5);
plot( 1:length(y), ((y)-mean(y))./std(y), 'color','r', 'linewidth',1.5);
title('shift traces');
clear x
% elseif varargin{1}==2
subplot(2,2,1)
%figure('color','w');
hold on
for i=1:5
plot(rand(10,1), rand(10,1), 'linestyle','none', 'marker','o',...
'markeredgecolor',rand(3,1) , 'markerfacecolor',rand(3,1));
end
ylim([-.5 1.5]); xlim([-.5 1.5]);
title('move dots');
subplot(2,2,2)
image;
hold on;
ch= get(gca,'children');
d=get(ch,'cdata');
mycmap = get(gcf,'Colormap');
cla;
colorbar off;
%close gcf;
% figure('color','w');
mycmap = mycmap(1:5:end,:);
hold on
d1=d-min(d(:));
d1=round(d1./max(d1(:)).* (size(mycmap,1)-1));
for i=1:size(mycmap,1)
[a a2]=deal([]);
[a a2]=find(d1==i-1);
plot( a2 , a , 'color', mycmap(i,:),'marker','o' ,'LineStyle', 'none',...
'MarkerFaceColor', mycmap(i,:),'MarkerSize',2.5 );
% pause
end
set(gca,'ydir','reverse');
xlim([0 100]);
ylim([0 100]);
title('move colors');
%axis off;
end
end
% ===end example ===================================================================
% =========================================================================
% =========================================================================
% ==================
% define icon pushbutton
% ==================%
x.do=1; %toggle between onOffStates of icon
x.icon =icon;%imagefun
hToolbar = findall(gcf,'Type','uitoolbar');%create icon in toolbar
try
bb=findall(gcf,'Type','uipushtool','Tag','uilineshift');
delete(bb);
end
if ~isempty(hToolbar) && isempty(findall(gcf,'Type','uipushtool','Tag','uilineshift'))
hPush = uipushtool('parent',hToolbar, ...
'separator','on', ...
'HandleVisibility','off', ...
'TooltipString','shift line', ...
'tag','uilineshift');
set(hPush,'userdata',x , 'ClickedCallback', {@update_pushtool,gcf,hPush},...
'cdata',x.icon(:,:,:,2) ); %set userdata, callback, iconimage
end% if
q=findall(gcf,'Type','uitoggletool');
set(q,'oncallback','uilineshift');%if another icon is clicked, renew uilineshift-function (e.g. it's deactivated)
% ==================
% if icon pushbutton called
% ==================%
function update_pushtool(cnc1,cnc2,gcf,hPush)
warning off
set(gcf,'WindowButtonupFcn',@figButtonup);
warning on;
%-------------------------------------------------------------------------------
set(findall(gcf,'Type','uitoggletool'),'state','off');%set all other icons 'off'
if ~ishandle(hPush); return; end% if
x=get(hPush,'userdata');
if x.do==0 % state 'off'
set(findall(gcf,'Type','uitoggletool'),'state','off');
img=x.icon(:,:,:,2);%replace image
set(gcf,'WindowButtonupFcn',[]);%remove callback
p=findobj(gca,'type','line');
set(p,'ButtonDownFcn',[]);
set(gca, 'UIContextMenu', []);% remove contextmenu
else % state 'on'
% it state ON, than remember original XY
activateuimode(gcf,'');
set(findall(gcf,'Type','uitoggletool'),'state','off');
ch=findobj(gcf,'type','axes');
for j=1:length(ch)
p=findobj(ch(j),'type','line');
for k = 1:length(p)
s=get(p(k),'userdata');
s.xorig=get(p(k),'xdata');
s.yorig=get(p(k),'ydata');
set(p(k),'UserData',s);
end
end
img=x.icon(:,:,:,1); %replace image
update();%UPDATER
warning off,
set(gcf,'WindowButtonupFcn',@figButtonup);
warning on;
cmenu; %set contextmenu
end%
%
x.do=~x.do;%toggle state
set(hPush,'cdata',img,'userdata',x);%replace image+change userdata
% ==================
% ICONS
% ==================
function img =icon()
c(:,:,1)=[NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0.98824 0.98824 NaN NaN NaN NaN 0.98824 0.98824 NaN NaN NaN; NaN NaN NaN NaN 0.98824 0.98824 1 0 NaN NaN 0.98824 NaN 0.98824 0.98824 NaN NaN; NaN NaN NaN 0.98824 0.98824 0 1 1 0 NaN 0.98824 NaN NaN 0.98824 NaN NaN; NaN NaN NaN 0.98824 NaN 0 1 1 1 0.98824 0.98824 NaN NaN 0.98824 0.98824 NaN; NaN NaN NaN 0.98824 NaN 0 1 1 1 1 0 NaN NaN NaN 0.98824 0.98824; 0.98824 NaN 0.98824 0.98824 NaN 0 1 1 1 1 1 0 NaN NaN NaN NaN; 0.98824 0.98824 0.98824 NaN NaN 0 1 1 1 1 1 1 0 NaN NaN NaN; NaN NaN NaN NaN NaN 0 1 1 1 1 0 0 0 0 NaN NaN; NaN NaN NaN NaN NaN 0 1 1 0 1 0 NaN NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0 1 0 0 1 1 0 NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0 0 NaN NaN 0 1 0 NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0 NaN NaN NaN 0 1 1 0 NaN NaN NaN; NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0 1 0 NaN NaN NaN; NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0 0 NaN NaN NaN NaN];
c(:,:,2)=[NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0.2 0.2 NaN NaN NaN NaN 0.2 0.2 NaN NaN NaN; NaN NaN NaN NaN 0.2 0.2 1 0 NaN NaN 0.2 NaN 0.2 0.2 NaN NaN; NaN NaN NaN 0.2 0.2 0 1 1 0 NaN 0.2 NaN NaN 0.2 NaN NaN; NaN NaN NaN 0.2 NaN 0 1 1 1 0.2 0.2 NaN NaN 0.2 0.2 NaN; NaN NaN NaN 0.2 NaN 0 1 1 1 1 0 NaN NaN NaN 0.2 0.2; 0.2 NaN 0.2 0.2 NaN 0 1 1 1 1 1 0 NaN NaN NaN NaN; 0.2 0.2 0.2 NaN NaN 0 1 1 1 1 1 1 0 NaN NaN NaN; NaN NaN NaN NaN NaN 0 1 1 1 1 0 0 0 0 NaN NaN; NaN NaN NaN NaN NaN 0 1 1 0 1 0 NaN NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0 1 0 0 1 1 0 NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0 0 NaN NaN 0 1 0 NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0 NaN NaN NaN 0 1 1 0 NaN NaN NaN; NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0 1 0 NaN NaN NaN; NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0 0 NaN NaN NaN NaN];
c(:,:,3)=[NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0.027451 0.027451 NaN NaN NaN NaN 0.027451 0.027451 NaN NaN NaN; NaN NaN NaN NaN 0.027451 0.027451 1 0 NaN NaN 0.027451 NaN 0.027451 0.027451 NaN NaN; NaN NaN NaN 0.027451 0.027451 0 1 1 0 NaN 0.027451 NaN NaN 0.027451 NaN NaN; NaN NaN NaN 0.027451 NaN 0 1 1 1 0.027451 0.027451 NaN NaN 0.027451 0.027451 NaN; NaN NaN NaN 0.027451 NaN 0 1 1 1 1 0 NaN NaN NaN 0.027451 0.027451; 0.027451 NaN 0.027451 0.027451 NaN 0 1 1 1 1 1 0 NaN NaN NaN NaN; 0.027451 0.027451 0.027451 NaN NaN 0 1 1 1 1 1 1 0 NaN NaN NaN; NaN NaN NaN NaN NaN 0 1 1 1 1 0 0 0 0 NaN NaN; NaN NaN NaN NaN NaN 0 1 1 0 1 0 NaN NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0 1 0 0 1 1 0 NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0 0 NaN NaN 0 1 0 NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0 NaN NaN NaN 0 1 1 0 NaN NaN NaN; NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0 1 0 NaN NaN NaN; NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0 0 NaN NaN NaN NaN];
img(:,:,:,1) =c;
c(:,:,1)=[NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0.4 0.4 NaN NaN NaN NaN 0.4 0.4 NaN NaN NaN; NaN NaN NaN NaN 0.4 0.4 0.38824 0 NaN NaN 0.4 NaN 0.4 0.4 NaN NaN; NaN NaN NaN 0.4 0.4 0 0.38824 0.38824 0 NaN 0.4 NaN NaN 0.4 NaN NaN; NaN NaN NaN 0.4 NaN 0 0.43137 0.43137 0.38824 0.4 0.4 NaN NaN 0.4 0.4 NaN; NaN NaN NaN 0.4 NaN 0 0.43137 0.43137 0.43137 0.43137 0 NaN NaN NaN 0.4 0.4; 0.4 NaN 0.4 0.4 NaN 0 0.43137 0.43137 0.43137 0.43137 0.43137 0 NaN NaN NaN NaN; 0.4 0.4 0.4 NaN NaN 0 0.43137 0.43137 0.43137 0.43137 0.43137 0.43137 0 NaN NaN NaN; NaN NaN NaN NaN NaN 0 0.43137 0.43137 0.43137 0.43137 0 0 0 0 NaN NaN; NaN NaN NaN NaN NaN 0 0.43137 0.43137 0 0.43137 0 NaN NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0 0.43137 0 0 0.43137 0.43137 0 NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0 0 NaN NaN 0 0.43137 0 NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0 NaN NaN NaN 0 0.43137 0.43137 0 NaN NaN NaN; NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0 0.43137 0 NaN NaN NaN; NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0 0 NaN NaN NaN NaN];
c(:,:,2)=[NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0.4 0.4 NaN NaN NaN NaN 0.4 0.4 NaN NaN NaN; NaN NaN NaN NaN 0.4 0.4 0.60784 0 NaN NaN 0.4 NaN 0.4 0.4 NaN NaN; NaN NaN NaN 0.4 0.4 0 0.60784 0.60784 0 NaN 0.4 NaN NaN 0.4 NaN NaN; NaN NaN NaN 0.4 NaN 0 0.38431 0.38431 0.60784 0.4 0.4 NaN NaN 0.4 0.4 NaN; NaN NaN NaN 0.4 NaN 0 0.38431 0.38431 0.38431 0.38431 0 NaN NaN NaN 0.4 0.4; 0.4 NaN 0.4 0.4 NaN 0 0.38431 0.38431 0.38431 0.38431 0.38431 0 NaN NaN NaN NaN; 0.4 0.4 0.4 NaN NaN 0 0.38431 0.38431 0.38431 0.38431 0.38431 0.38431 0 NaN NaN NaN; NaN NaN NaN NaN NaN 0 0.38431 0.38431 0.38431 0.38431 0 0 0 0 NaN NaN; NaN NaN NaN NaN NaN 0 0.38431 0.38431 0 0.38431 0 NaN NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0 0.38431 0 0 0.38431 0.38431 0 NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0 0 NaN NaN 0 0.38431 0 NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0 NaN NaN NaN 0 0.38431 0.38431 0 NaN NaN NaN; NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0 0.38431 0 NaN NaN NaN; NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0 0 NaN NaN NaN NaN];
c(:,:,3)=[NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0.4 0.4 NaN NaN NaN NaN 0.4 0.4 NaN NaN NaN; NaN NaN NaN NaN 0.4 0.4 0.61176 0 NaN NaN 0.4 NaN 0.4 0.4 NaN NaN; NaN NaN NaN 0.4 0.4 0 0.61176 0.61176 0 NaN 0.4 NaN NaN 0.4 NaN NaN; NaN NaN NaN 0.4 NaN 0 0.39216 0.39216 0.61176 0.4 0.4 NaN NaN 0.4 0.4 NaN; NaN NaN NaN 0.4 NaN 0 0.39216 0.39216 0.39216 0.39216 0 NaN NaN NaN 0.4 0.4; 0.4 NaN 0.4 0.4 NaN 0 0.39216 0.39216 0.39216 0.39216 0.39216 0 NaN NaN NaN NaN; 0.4 0.4 0.4 NaN NaN 0 0.39216 0.39216 0.39216 0.39216 0.39216 0.39216 0 NaN NaN NaN; NaN NaN NaN NaN NaN 0 0.39216 0.39216 0.39216 0.39216 0 0 0 0 NaN NaN; NaN NaN NaN NaN NaN 0 0.39216 0.39216 0 0.39216 0 NaN NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0 0.39216 0 0 0.39216 0.39216 0 NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0 0 NaN NaN 0 0.39216 0 NaN NaN NaN NaN; NaN NaN NaN NaN NaN 0 NaN NaN NaN 0 0.39216 0.39216 0 NaN NaN NaN; NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0 0.39216 0 NaN NaN NaN; NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0 0 NaN NaN NaN NaN];
img(:,:,:,2) = c;
% ==================
% BUTTON-UP/DOWN
% ==================
%if button down ...
function lineButtonDown(this,varargin)
set(gcf,'WindowButtonMotionFcn',@figButtonMotion);%activate WBMF
%if button up..
function figButtonup(this,varargin);%du UPDATE
update()
% ==================
% UPDATE
% ==================
function update()
han=findall(gcf,'tag','uilineshift');%get handle of ICON
x=get(han, 'userdata');
set(gcf,'WindowButtonMotionFcn',[]);%deactivate WBMF
p=findobj(gca,'type','line');%get handles of all line in axis
%for each line, update XY
for k = 1:length(p)
s=get(p(k),'userdata');
s.k=k;
s.x=get(p(k),'xdata');
s.y=get(p(k),'ydata');
s.xo=[];
set(p(k),'UserData',s,'ButtonDownFcn',{@lineButtonDown,p(k)});
end
% ==================
% motion [ Moving lines]
% ==================
function figButtonMotion(varargin)
curr_pt = get(gca,'CurrentPoint');
this=gco;
s=get(this,'UserData');
if isempty(s.xo)%reference values XY
s.xo=curr_pt;
set(this,'UserData',s);
else
set(this,'YData',s.y - s.xo(1, 2) +curr_pt(1, 2) );%update XY
set(this,'xData',s.x - s.xo(1, 1) +curr_pt(1, 1));
s.x=get(this,'xdata');
s.y=get(this,'ydata');
s.xo=curr_pt;% s.xo=[];
set(this,'UserData',s);
end
% ==================
% context menu and callbacks
% ==================
function cmenu
cmenu = uicontextmenu;
ch=findobj(gcf,'type','axes'); %for all axes
set(ch, 'UIContextMenu', cmenu,'tag', 'context2');% Define the context menu
item1 = uimenu(cmenu, 'Label', 'original', 'Callback', {@cb1,[]});%ITEM1: set XY to original value
% callbacks ITEM1 of ontext menu
% set XY to original value
function cb1(varargin)
p=findobj(gca,'type','line');%get all line-handles
for k = 1:length(p)
s=get(p(k),'UserData');
set(p(k),'xdata', s.xorig);
set(p(k),'ydata', s.yorig);
end