pop_topoplot.m

来自「含有多种ICA算法的eeglab工具箱」· M 代码 · 共 420 行

M
420
字号
% pop_topoplot() - Plot scalp map(s) in a figure window. If number of input%                  arguments is < 3, pop-up an interactive query window.%% Usage:%   >> pop_topoplot( EEG, typeplot, items, title, options...);%   >> pop_topoplot( EEG, typeplot, items, title, plotdip, options...);%% Inputs:%   EEG      - Input EEG dataset structure (see >> help eeglab)%   typeplot - 1-> Plot ERP maps, 0-> plot components {default:1}.%   items    - [array] If typeplot==1 (ERP maps), within-epoch latencies %              (ms) at which to plot the maps. If typeplot==0 (component%              maps), component indices to plot. In this case,%              negative map indices -> invert map polarity, or %              NaN -> leave a blank subplot. (Ex: [1 -3 NaN 4])%   title    - Plot title.%   rowscols - Vector of the form [m,n] giving [rows, cols] per page.%              If the number of maps exceeds m*n, multiple figures %              are produced {default|0 -> one near-square page}.%   plotdip  - [0|1] plot associated dipole(s) for scalp map if present%              in dataset.%   options  - topoplot() argument options. Separate using commas. %              Example 'style', 'straight'. See >> help topoplot%              for further details. {default: none}%% Note:%   A new figure is created automatically only when the pop_up window is %   called or when more than one page of maps are plotted. Thus, this %   command may be used to draw topographic maps in a figure sub-axis.%% Author: Arnaud Delorme, CNL / Salk Institute, 2001%% See also: topoplot(), eeglab()%123456789012345678901234567890123456789012345678901234567890123456789012% Copyright (C) 2001 Arnaud Delorme, Salk Institute, arno@salk.edu%% This program is free software; you can redistribute it and/or modify% it under the terms of the GNU General Public License as published by% the Free Software Foundation; either version 2 of the License, or% (at your option) any later version.%% This program is distributed in the hope that it will be useful,% but WITHOUT ANY WARRANTY; without even the implied warranty of% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the% GNU General Public License for more details.%% You should have received a copy of the GNU General Public License% along with this program; if not, write to the Free Software% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA% $Log: pop_topoplot.m,v $% Revision 1.41  2004/03/18 00:32:19  arno% remove skirt%% Revision 1.40  2004/02/22 23:54:00  scott% making electrodes,on the default option%% Revision 1.39  2004/02/22 23:48:49  scott% made srhink,skirt the default option%% Revision 1.38  2004/02/17 22:48:39  arno% add dipsphere%% Revision 1.37  2004/01/30 15:59:23  arno% topoplot msg displayed only for 1st plot%% Revision 1.36  2003/12/11 16:16:42  arno% debug history generation%% Revision 1.35  2003/11/06 02:12:57  arno% put RV to title%% Revision 1.34  2003/11/06 01:54:14  arno% adding dipole plot%% Revision 1.33  2003/11/05 20:35:54  arno% plot dipoles%% Revision 1.32  2003/10/29 01:06:08  arno% remove debuging message%% Revision 1.31  2003/10/11 02:26:01  arno% modify default title%% Revision 1.30  2003/10/11 02:20:31  arno% shift colorbar to left for 1 plot%% Revision 1.29  2003/10/11 02:11:42  arno% debuging for empty option%% Revision 1.28  2003/08/07 20:49:15  arno% option 'masksurf' to speed up display%% Revision 1.27  2003/07/17 23:20:16  scott% formatting%% Revision 1.26  2003/07/03 16:55:07  arno% header%% Revision 1.25  2003/07/03 16:52:44  arno% same%% Revision 1.24  2003/07/03 16:51:16  arno% header text%% Revision 1.23  2003/05/12 22:27:56  arno% verbose option off%% Revision 1.22  2003/03/12 03:20:41  arno% help button%% Revision 1.21  2003/03/06 02:20:39  arno% use vararg2str%% Revision 1.20  2002/10/26 20:26:50  arno% help msg%% Revision 1.19  2002/10/11 22:15:59  arno% header%% Revision 1.18  2002/08/27 00:38:21  arno% cl more optimal auto location%% Revision 1.17  2002/08/22 17:38:39  arno% correct title%% Revision 1.16  2002/08/22 17:01:14  arno% debugging for 1 plot%% Revision 1.15  2002/08/20 00:05:38  arno% adding test for plotting a large number of components%% Revision 1.14  2002/08/19 22:20:21  arno% 10 -> strvcat%% Revision 1.13  2002/08/19 22:15:02  arno% text for components%% Revision 1.12  2002/08/17 22:30:28  scott% ERP/components%% Revision 1.11  2002/08/17 22:26:05  scott% typo%% Revision 1.10  2002/08/17 22:24:15  scott% tyop%% Revision 1.9  2002/08/17 22:21:02  scott% help msg and menu text%% Revision 1.8  2002/08/17 22:16:19  scott% editing help msg%% Revision 1.7  2002/08/17 22:15:51  scott% *** empty log message ***%% Revision 1.6  2002/08/13 17:49:37  arno% debug color%% Revision 1.5  2002/08/12 16:31:20  arno% inputdlg2%% Revision 1.4  2002/08/12 01:46:44  arno% color%% Revision 1.3  2002/08/11 22:22:19  arno% color%% Revision 1.2  2002/04/18 18:26:14  arno% typo can not%% Revision 1.1  2002/04/05 17:32:13  jorn% Initial revision%% 01-25-02 reformated help & license -ad % 02-15-02 text interface editing -sm & ad % 02-16-02 added axcopy -ad & sm% 03-18-02 added title -ad & smfunction com = pop_topoplot( EEG, typeplot, arg2, topotitle, rowcols, varargin);com = '';if nargin < 1   help pop_topoplot;   return;end;   if nargin < 2      typeplot = 1;end;if typeplot == 0 & isempty(EEG.icasphere)   disp('Error: no ICA data for this set, first run ICA'); return;end;   if isempty(EEG.chanlocs)   disp('Error: cannot plot topography without channel location file'); return;end;   if nargin < 3	% which set to save	% -----------------	if typeplot		txtwhat2plot1 = 'Plotting ERP scalp maps at these latencies';        txtwhat2plot2 = sprintf('(range: %d to %d ms, NaN -> empty):', ...                                round(EEG.xmin*1000), round(EEG.xmax*1000));        editwhat2plot = [''];	else		txtwhat2plot1 = 'Component numbers';		txtwhat2plot2 = '(negate index to invert component polarity; NaN -> empty subplot; Ex: -1 NaN 3)';        editwhat2plot = ['1:' int2str(size(EEG.icaweights,1))]; 	end;	    uilist = { { 'style'   'text'     'string'    txtwhat2plot1 } ...               { 'style'   'edit'     'string'    editwhat2plot } ...               { 'style'   'text'     'string'    txtwhat2plot2 } ...               { } ...               { 'style'   'text'     'string'    'Plot title' } ...               { 'style'   'edit'     'string'    fastif(~isempty(EEG.setname), [EEG.setname], '') } ...               { 'style'   'text'     'string'    'Plot geometry (rows,col.); [] -> near square' } ...               { 'style'   'edit'     'string'    '[]' } ...               { 'style'   'text'     'string'    'Plot associated dipole(s) (if present)' } ...               { 'style'   'checkbox' 'string'    '' } { } ...               { } ...               { 'style'   'text'     'string'    [ '-> Additional scalp map' fastif(typeplot,'',' (and dipole)') ...                                                  ' plotting options (see help)' ] } ...               { 'style'   'edit'     'string'    '''electrodes'', ''on''' } };    uigeom = { [1.5 1] [1] [1] [1.5 1] [1.5 1] [1.55 0.2 0.8] [1] [1] [1] };    if typeplot        uilist(9:11) = [];        uigeom(6) = [];    end;    guititle = fastif( typeplot, 'ERP scalp map(s) -- pop_topoplot()', ...                       'Component scalp map(s) -- pop_topoplot()');        result = inputgui( uigeom, uilist, 'pophelp(''pop_topoplot'')', guititle, [], 'normal');	if length(result) == 0 return; end;	    % reading first param    % -------------------    arg2   	     = eval( [ '[' result{1} ']' ] );	if length(arg2) > EEG.nbchan		tmpbut = questdlg2(...                  ['This involves drawing ' int2str(length(arg2)) ' plots. Continue ?'], ...                         '', 'Cancel', 'Yes', 'Yes');		if strcmp(tmpbut, 'Cancel'), return; end;	end;    if isempty(arg2), error('Nothing to plot; enter parameter in first edit box'); end;        % reading other params    % --------------------	topotitle   = result{2};	rowcols     = eval( [ '[' result{3} ']' ] );    if typeplot        plotdip = 0;        try, options      = eval( [ '{ ' result{4} ' }' ]);        catch, error('Invalid scalp map options'); end;    else        plotdip     = result{4};        try, options      = eval( [ '{ ' result{5} ' }' ]);        catch, error('Invalid scalp map options'); end;    end;            if length(arg2) == 1, figure; try, icadefs; set(gcf, 'color', BACKCOLOR); catch, end; end;else    if ~isempty(varargin) & isnumeric(varargin{1})        plotdip = varargin{1};        varargin = varargin(2:end);    else        plotdip = 0;    end;    options = varargin;end;% additional options% ------------------options    = { options{:} 'masksurf' 'on' };outoptions = { options{:} }; % for commandnbgraph = size(arg2(:),1);if ~exist('topotitle')    topotitle = '';end;    if ~exist('rowcols') | isempty(rowcols) | rowcols == 0    rowcols(2) = ceil(sqrt(nbgraph));    rowcols(1) = ceil(nbgraph/rowcols(2));end;    SIZEBOX = 150;fprintf('Plotting...\n');if isempty(EEG.chanlocs)	fprintf('Error: set has no channel location file\n');	return;end;% determine the scale for plot of different times (same scales)% -------------------------------------------------------------if typeplot	SIGTMP = reshape(EEG.data, EEG.nbchan, EEG.pnts, EEG.trials);	pos = round( (arg2/1000-EEG.xmin)/(EEG.xmax-EEG.xmin) * (EEG.pnts-1))+1;	indexnan = find(isnan(pos));	nanpos = find(isnan(pos));	pos(nanpos) = 1;	SIGTMPAVG = mean(SIGTMP(:,pos,:),3);	SIGTMPAVG(:, nanpos) = NaN;	maxlim = max(SIGTMPAVG(:));	minlim = min(SIGTMPAVG(:));	maplimits = [ -max(maxlim, -minlim) max(maxlim, -minlim)];end;	% plot the graphs% ---------------counter = 1;countobj = 1;allobj = zeros(1,1000);for index = 1:size(arg2(:),1)	if nbgraph > 1        if mod(index, rowcols(1)*rowcols(2)) == 1            if index> 1, a = textsc(0.5, 0.05, topotitle); set(a, 'fontweight', 'bold'); end;        	figure;			pos = get(gcf,'Position');			posx = max(0, pos(1)+(pos(3)-SIZEBOX*rowcols(2))/2);			posy = pos(2)+pos(4)-SIZEBOX*rowcols(1);			set(gcf,'Position', [posx posy  SIZEBOX*rowcols(2)  SIZEBOX*rowcols(1)]);			try, icadefs; set(gcf, 'color', BACKCOLOR); catch, end;       end;    		subplot( rowcols(1), rowcols(2), mod(index-1, rowcols(1)*rowcols(2))+1);        set(gca, 'visible', 'off')	end;	% add dipole location if present    % ------------------------------    options = outoptions;    dipoleplotted = 0;    if plotdip & typeplot == 0        if isfield(EEG, 'dipfit') & isfield(EEG.dipfit, 'model')            if length(EEG.dipfit.model) >= index                curpos = EEG.dipfit.model(arg2(index)).posxyz/EEG.dipfit.vol.r(end);                curmom = EEG.dipfit.model(arg2(index)).momxyz;                if size(curpos,1) > 1 & any(curpos(2,:) ~= 0)                    options = { options{:} 'dipole' [ curpos(:,1:2) curmom(:,1:3) ] };                    dipoleplotted = 1;                else                    if  any(curpos(1,:) ~= 0)                        options = { options{:} 'dipole' [ curpos(1,1:2) curmom(1,1:3) ] };                        dipoleplotted = 1;                    end;                end;                if nbgraph ~= 1                    options = {  options{:} 'dipscale' 0.6 };                end;                options = { options{:} 'dipsphere' max(EEG.dipfit.vol.r) };            end;        end;    end;    	% plot scalp map    % --------------    if index == 1        addopt = { 'verbose', 'on' };    else         addopt = { 'verbose', 'off' };    end;    if ~isnan(arg2(index))		if typeplot            tmpobj = topoplot( SIGTMPAVG(:,index), EEG.chanlocs, 'maplimits', maplimits, addopt{:}, options{:});			if nbgraph == 1,                  title( [ 'Latency ' int2str(arg2(index)) ' ms from ' topotitle] );			else                  title([int2str(arg2(index)) ' ms']);			end;		else            if arg2(index) < 0                tmpobj = topoplot( -EEG.icawinv(:, -arg2(index)), EEG.chanlocs, addopt{:}, options{:} );            else                tmpobj = topoplot( EEG.icawinv(:, arg2(index)), EEG.chanlocs, addopt{:}, options{:} );            end;    						if nbgraph == 1, texttitle = [ 'IC ' int2str(arg2(index)) ' from ' topotitle];			else             texttitle = ['' int2str(arg2(index))];			end;            if dipoleplotted, texttitle = [ texttitle ' (' num2str(EEG.dipfit.model(arg2(index)).rv*100,2) '%)']; end;            title(texttitle);		end;        allobj(countobj:countobj+length(tmpobj)-1) = tmpobj;        countobj = countobj+length(tmpobj);		drawnow;		axis square; 		if index == size(arg2(:),1)	        if nbgraph == 1                clim = get(gca, 'clim');                pos = get(gca,'position');                q = [pos(1) pos(2) 0 0];                s = [pos(3) pos(4) pos(3) pos(4)];                col = colormap;                ax = axes('position', [0.95 0 .05 1].*s+q);                cbar(ax,[1:64],clim);	        else                 cbar('vert');            end;	    end;	       else    axis off    end;end;if nbgraph> 1,    a = textsc(0.5, 0.05, topotitle);    set(a, 'fontweight', 'bold'); end;if nbgraph== 1,    com = 'figure;'; end;set(allobj(1:countobj-1), 'visible', 'on');axcopy(gcf, 'set(gcf, ''''units'''', ''''pixels''''); postmp = get(gcf, ''''position''''); set(gcf, ''''position'''', [postmp(1) postmp(2) 560 420]); clear postmp;');com = [com sprintf('pop_topoplot(%s,%d, %s);', ...                   inputname(1), typeplot, vararg2str({arg2 topotitle rowcols plotdip outoptions{:} }))];return;		

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?