?? polarhg.m
字號:
function H = polarhg(theta,rho,p1,v1,p2,v2,p3,v3,p4,v4,p5,v5,p6,v6,p7,v7,p8,v8)
warning off
%
% POLARHG is similar to polar; however, it is possible to set some
% pseudo-properties. Below is a table of the pseudo-properties,
% their function, and settings:
%
% PSEUDO-
% PROPERTY FUNCTION SETTING/OPTIONS
% -------- -------- ---------------
% theta The theta values any valid vector
% rho The rho values any valid vector
% tdir Controls the direction [ClockWise|{CounterClockWise}]
% that the angles are
% labeled.
% rlim Rho limits NaN -> 2-element vector [min max]
% rtick Rho tick mark NaN -> any valid vector
% location
% tstep Step used for 30 -> scalar in degrees
% Drawing the spokes
% torig Origin of theta [Up|Down|Left|{Right}]
% color Color of trace [RGB Vector|Colorspec|{'Y'}]
% linestyle Line style [{-}|+|--|:|.|x|o|*]
%
% Examples of use:
%
% theta = 0:pi/5:pi;
% rho = 10*rand(size(theta));
% h = polarhg(theta,rho,'tdir','clockwise','rlim',[0 10], ...
% 'rtick',[0 3 6 9],'tstep',45,'torig','down', ...
% 'color','m','linestyle',':');
% SEE ALSO: POLAR
% Written by John L. Galenski III 11/01/93-04/07/94
% All Rights Reserved
% LDM052694jlg
%%%%% This M-file has not been tested by the MathWorks, Inc.
%%%%% There are some known problems with error checking,
%%%%% however, the M-file is operational.
%%%%% Note, the grid for the polar plot now consists of two
%%%%% lines. One connects the spokes, and the other connects
%%%%% the circles.
%%%%% Future enhancements:
%%%%%
%%%%% ttick location of spokes
N = nargin;
% Create the property name/property value string arrays
PropFlag = zeros(1,7);
for X = 1:(N-2)/2
p = eval(['p',int2str(X)]);
v = eval(['v',int2str(X)]);
if X == 1
Property_Names = p;
Property_Value = v;
else
Property_Names = str2mat(Property_Names,p);
Property_Value = str2mat(Property_Value,v);
end
if strcmp(p,'color')
PropFlag(1) = 1;
color = v;
elseif strcmp(p,'rtick')
PropFlag(2) = 1;
rtick = v;
elseif strcmp(p,'rlim')
PropFlag(3) = 1;
rlim = v;
elseif strcmp(p,'tdir')
PropFlag(4) = 1;
tdir = v;
elseif strcmp(p,'tstep')
PropFlag(5) = 1;
tstep = v;
elseif strcmp(p,'torig')
PropFlag(6) = 1;
torig = v;
elseif strcmp(p,'linestyle')
PropFlag(7) = 1;
linestyle = v;
else
error(['Invalid pseudo-property name: ',p])
end
end
% Determine which properties have not been set by
% the user
NotSet = find(PropFlag == 0);
Default_Settings = ['''y'' ';
'NaN ';
'NaN ';
'''counterclockwise'' ';
'30 ';
'''right'' ';
'''-'' '];
Property_Names = ['color ';
'rtick ';
'rlim ';
'tdir ';
'tstep ';
'torig ';
'linestyle'];
for I = 1:length(NotSet)
eval([Property_Names(NotSet(I),:),'=',Default_Settings(NotSet(I),:),';'])
end
% Start
CurrentAxes = newplot;
NextPlot = get(CurrentAxes,'NextPlot');
HoldFlag = ishold;
AxisColor = get(CurrentAxes,'XColor');
if ~HoldFlag
hold on
% make a radial grid
if ~isnan(rlim) % rlim is defined
MinRho = find(rho<min(rlim)); % Minimum rho limit
MaxRho = find(rho>max(rlim)); % Maximum rho limit
rho([MinRho,MaxRho]) = [].*ones(size([MinRho,MaxRho]));
theta([MinRho,MaxRho]) = [].*ones(size([MinRho,MaxRho]));
end
Temp=plot([0 max(theta(:))],[0 max(abs(rho(:)))]); % Initialize plotting info
AxisLim = [get(CurrentAxes,'xlim') get(CurrentAxes,'ylim')];
NumTicks = length(get(CurrentAxes,'ytick'));
delete(Temp);
% check radial limits and ticks
if isnan(rtick) % rtick not defined
if ~isnan(rlim) % rlim is defined
Rmin = rlim(1); % Initialize Rmin
Rmax = rlim(2); % Initialize Rmax
else % rlim is not defined
Rmin = 0; % Set Rmin = 0
Rmax = AxisLim(4); % Set Rmax = maximum y-axis value
end
NumTicks = NumTicks-1; % Number of circles
if NumTicks > 5 % see if we can reduce the number
if rem(NumTicks,2) == 0
NumTicks = NumTicks/2;
elseif rem(NumTicks,3) == 0
NumTicks = NumTicks/3;
end
end
Rinc = (Rmax-Rmin)/NumTicks; % Distance between circles
rtick = (Rmin+Rinc):Rinc:Rmax; % radii of circles
else % rtick is defined
if isnan(rlim) % rlim is not defined
% Rmin = -60; % set Rmin = -60 SPB
Rmin = 0; % set Rmin = 0
Rmax = max(rtick); % set Rmax = max rtick value
else % rlim is defined
Rmin = min(rlim); % set Rmin = minimum rlim
Rmax = max(rlim); % set Rmax = maximum rlim
RtickMin = find(rtick<Rmin); % find elements of rtick < min(rlim)
RtickMax = find(rtick>Rmax); % find elements of rtick > max(rlim)
% remove these values from rtick
rtick([RtickMin,RtickMax]) = [].*ones(size([RtickMin,RtickMax]));
end
rtick = [Rmin,rtick,Rmax]; % the new radii
set(CurrentAxes,'Ylim',[Rmin Rmax]) % set the Y-limits to [Rmin Rmax]
NumTicks = length(rtick)-1; % number of circles
end
% plot spokes
th = (1:.5*360/tstep)*2*pi*tstep/360; % define the spokes
cst = cos(th);
snt = sin(th);
cs = [-cst; cst];
sn = [-snt; snt];
cs = [cs;NaN.*cs(1,:)];
sn = [sn;NaN.*sn(1,:)];
% plot the spokes
hh = plot((Rmax-Rmin)*cs(:),(Rmax-Rmin)*sn(:),'-', ...
'color',AxisColor,'linewidth',1);
set(0,'UserData',hh)
% annotate spokes in degrees
Rt = 1.1*(Rmax-Rmin);
for i = 1:max(size(th))
text(Rt*cst(i),Rt*snt(i),int2str(i*tstep),'horizontalalignment','center');
if i == max(size(th))
loc = int2str(0);
else
loc = int2str(180+i*tstep);
end
text(-Rt*cst(i),-Rt*snt(i),loc,'horizontalalignment','center');
end
% set view to 2-D. Use the appropriate view (tdir)
tdir = lower(tdir);
torig = lower(torig);
if strcmp(tdir(1:5),'count') & strcmp(torig,'right')
view(0,90);
InitTh = 0;
elseif strcmp(tdir(1:5),'count') & strcmp(torig,'left')
view(180,90);
InitTh = 1;
elseif strcmp(tdir(1:5),'count') & strcmp(torig,'up')
view(-90,90);
InitTh = 2;
elseif strcmp(tdir(1:5),'count') & strcmp(torig,'down')
view(90,90);
InitTh = 3;
elseif strcmp(tdir(1:5),'clock') & strcmp(torig,'right')
view(0,-90);
InitTh = 0;
elseif strcmp(tdir(1:5),'clock') & strcmp(torig,'left')
view(180,-90);
InitTh = 1;
elseif strcmp(tdir(1:5),'clock') & strcmp(torig,'up')
view(90,-90);
InitTh = 2;
elseif strcmp(tdir(1:5),'clock') & strcmp(torig,'down')
view(-90,-90);
InitTh = 3;
else
error('Invalid TDir or TOrig')
end
if strcmp(torig,'up') | strcmp(torig,'down')
axis square
end
% define a circle
th = 0:pi/75:2*pi;
xunit = cos(th);
yunit = sin(th);
% This code has been vectorized so that only one line
% is used to draw the circles.
MultFact = rtick-Rmin;
[MM,NN] = size(MultFact);
[MMM,NNN] = size(xunit);
XUNIT = [MultFact' * ones(1,NNN)] .* [ones(NN,1) * xunit];
YUNIT = [MultFact' * ones(1,NNN)] .* [ones(NN,1) * yunit];
XUNIT = XUNIT';
YUNIT = YUNIT';
XX = [XUNIT;NaN.*XUNIT(1,:)];
YY = [YUNIT;NaN.*YUNIT(1,:)];
hhh = plot(XX(:),YY(:),'-','Color',AxisColor,'LineWidth',1);
% Add the text and make sure that it always starts at the origin
% and moves up.
for i = MultFact
if InitTh == 0 % Right
Xt = 0;
Yt = i;
elseif InitTh == 1 % Left
Xt = 0;
Yt = -i;
elseif InitTh == 2 % Up
Xt = i;
Yt = 0;
elseif InitTh == 3 % Down
Xt = -i;
Yt = 0;
else
Xt = 0;
Yt = i;
end
text(Xt+1,Yt,num2str(i+Rmin),'VerticalAlignment','bottom', ...
'HorizontalAlignment','left');
end
% set axis limits
axis((Rmax-Rmin)*[-1 1 -1.1 1.1]);
else
Rmin = min(rlim);
Rmax = max(rlim);
end
% transform data to Cartesian coordinates.
xx = (rho-Rmin).*cos(theta); % I'm not sure if this is correct
yy = (rho-Rmin).*sin(theta);
% plot data on top of grid
q = plot(xx,yy);
set(q,'Color',color,'linestyle',linestyle)
if nargout > 0
hpol = q;
end
if ~HoldFlag
axis('equal');axis('off');
end
% reset hold state
if ~HoldFlag, set(CurrentAxes,'NextPlot',NextPlot); end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -