www.gusucode.com > mbcguitools 工具箱 matlab 源码程序 > mbcguitools/@mvgraph4d/private/pr_plot.m

    function pr_plot(gr)
%GPR_PLOT Private function
%  This is a private graph4d function used to plot data

%  Copyright 2000-2010 The MathWorks, Inc. and Ford Global Technologies, Inc.


ud = gr.DataPointer.info;
data = ud.data;
labels = get(gr.xfactor,'String');

if ~iscell(labels)
    labels={labels};
end
x=get(gr.xfactor,'Value');
y=get(gr.yfactor,'Value');
z=get(gr.zfactor,'Value');
c=get(gr.cfactor,'Value');

if ~isempty(data)
    nonnandata = ~any(isnan(data(:, [x y z c])), 2);
    xdata = data(nonnandata,x);
    ydata = data(nonnandata,y);
    zdata = data(nonnandata,z);
    cdata = data(nonnandata,c);
else
    xdata = [];
    ydata = [];
    zdata = [];
    cdata = [];
end

if isempty(xdata)
    set(gr.surf,'Faces',1,'Vertices',[0 0 0],'FaceVertexCData',0,...
        'FaceColor','none','Marker','none');
    if ud.datatags
        % Remove all tags
        ud.datataghandles = mbctagdata([], {}, gr.axes, ud.datataghandles, 'off', 'simple');
    end  
else
    % if range limiter is checked, need to reduce all data here
    if get(gr.colorbar.userange,'Value')
        cmax = ud.rangepositions(3);
        cmin = ud.rangepositions(1);
        % convert to actual units
        ylim=get(gr.colorbar.axes,'YLim');
        clim=get(gr.axes,'CLim');
        cmax=clim(1)+(clim(2)-clim(1))*(cmax-ylim(1))/(ylim(2)-ylim(1));
        cmin=clim(1)+(clim(2)-clim(1))*(cmin-ylim(1))/(ylim(2)-ylim(1));
        inds=find(cdata<=cmax & cdata>=cmin);
        xdata=xdata(inds);
        ydata=ydata(inds);
        zdata=zdata(inds);
        cdata=cdata(inds);
        % inds is also used later on for the data tags
    end
    
    switch lower(ud.type)
        case 'scatter'            
            Npts = length(xdata);
            tri = zeros(3, ceil(Npts/3));   
            tri(1:Npts) = 1:Npts;
            if numel(tri)>Npts
                tri(Npts+1:numel(tri)) = 1:(numel(tri)-Npts);
            end
            tri = tri.';
            
            % set colours for colorbar
            clim=get(gr.axes,'CLim');
            cmap=get(gr.colorbar.bar,'FaceVertexCData');
            n=size(cmap,1);
            mn=clim(1);mx=clim(2);
            % work out cdata - needs to be one for each vertex (zdata)
            if ~isempty(cdata)
                edges = mn:((mx-mn)/n):mx;
                [nul,bin]=histc(cdata,[-inf edges(2:end-1) inf]);
                bin(bin==0)=1;
            else
                bin=[];
            end
            
            % reshape cmap ready.
            coldata=cmap(bin(:),:);
            
            if ~isempty(cdata)
                vert=[xdata(:) ydata(:) zdata(:)];
            else
                vert=[];
            end
            
            if size(vert,1)==1
                vert=[vert;vert;vert];
                tri=[1 2 3];
                coldata=[coldata;coldata;coldata];
            elseif size(vert,1)==2
                vert(end+1,:)=vert(1,:);
                tri=[1 2 3];
                coldata(end+1,:)=coldata(1,:);
            end
            
            set(gr.surf,'Faces',tri,'Vertices',vert,'FaceVertexCData',coldata,...
                'FaceColor','none','EdgeColor','none',...
                'FaceLighting', 'none', 'EdgeLighting', 'none',...
                'Marker','o','MarkerEdgeColor','flat','MarkerFaceColor','flat');
            
            if ud.datatags
                % Update tags
                tol = [0 0 0];
                axlim = get(gr.axes, 'XLim');
                tol(1) = (axlim(2)-axlim(1))./250;
                axlim = get(gr.axes, 'YLim');
                tol(2) = (axlim(2)-axlim(1))./250;
                axlim = get(gr.axes, 'ZLim');
                tol(3) = (axlim(2)-axlim(1))./250;
                if ud.datatags==1 || ud.datatags==2
                    sTags = pr_getDataTags(gr);
                    if get(gr.colorbar.userange,'Value')
                        % remove tags for data that isn't displayed
                        sTags = sTags(inds);
                    end
                    if length(sTags)==length(xdata)
                        ud.datataghandles = mbctagdata([xdata(:) ydata(:) zdata(:)], sTags, ...
                            gr.axes, ud.datataghandles, 'off', 'pointoverlap', tol);
                    else
                        ud.datataghandles = mbctagdata([], {}, gr.axes, ud.datataghandles, 'off', 'simple');
                    end
                else
                    ud.datataghandles = mbccountedtagdata([xdata(:) ydata(:) zdata(:)], ...
                        gr.axes, ud.datataghandles, 'off', tol);
                end
            end

        otherwise
            if length(xdata)>3
                try
                    tri=convhulln([xdata(:) ydata(:) zdata(:)]);
                catch
                    try
                        tri=convhulln([xdata(:) ydata(:) zdata(:)], {'QJ','Qt','Qbb','Qc','QbB','Pp'});
                    catch
                        tri=[];
                    end
                end
            else
                tri=[];
            end
            % set colours for colorbar
            clim=get(gr.axes,'CLim');
            cmap=get(gr.colorbar.bar,'FaceVertexCData');
            n=size(cmap,1);
            mn=clim(1);mx=clim(2);
            % work out cdata - needs to be one for each vertex (zdata)
            if ~isempty(cdata)
                edges = mn:((mx-mn)/n):mx;
                [nul,bin]=histc(cdata,[-inf edges(2:end-1) inf]);
                bin(bin==0)=1;
            else
                bin=[];
            end
            
            % reshape cmap ready.
            coldata=cmap(bin(:),:);
            
            if ~isempty(cdata)
                vert=[xdata(:) ydata(:) zdata(:)];
            else
                vert=[];
            end
            
            if size(vert,1)==1
                vert=[vert;vert;vert];
                tri=[1 2 3];
                coldata=[coldata;coldata;coldata];
            elseif size(vert,1)==2
                vert(end+1,:)=vert(1,:);
                tri=[1 2 3];
                coldata(end+1,:)=coldata(1,:);
            end
            switch lower(ud.type)  
                case 'mesh'
                    set(gr.surf,'Faces',tri,'Vertices',vert,'FaceVertexCData',coldata,...
                        'FaceColor','none','EdgeColor','interp',...
                        'FaceLighting', 'none', 'EdgeLighting', 'flat',...
                        'Marker','none');
                case 'surface'
                    set(gr.surf,'Faces',tri,'Vertices',vert,'FaceVertexCData',coldata,...
                        'FaceColor','interp', ...
                        'EdgeColor',get(mbcgui.hgclassesutil.toNative(gr.axes),'DefaultSurfaceEdgeColor'),...
                        'Marker','none');
            end
            if ud.datatags
                % Data tags not supported in mesh/surface mode at the moment
                ud.datataghandles = mbctagdata([], {}, gr.axes, ud.datataghandles, 'off', 'simple');
            end
    end
    
    set(gr.axes,'CameraPositionMode','auto','CameraTargetMode','auto');
end

% set axis labels
lbls=get(gr.axes,{'XLabel';'ylabel';'zlabel'});
set([lbls{:}],{'String'},labels([x; y; z]),'Interpreter','none');
lbls=get(gr.colorbar.axes,'Title');
set(lbls,{'String'},labels(c),'Interpreter','none');

gr.DataPointer.info = ud;