📄 mmpolar.m
字号:
set(D.HAPatch,'XData',xdata,'YData',ydata)
end
%--------------------------------------------------------------------------
function [P,D]=local_placeRGrid(HAxes,P,D,S) %#ok local_placeRGrid
tinc=pi/250;
if P.TLimit(1)>P.TLimit(2)
theta=[P.TLimit(1):tinc:(P.TLimit(2)+2*pi-eps) P.TLimit(2)+2*pi];
else
theta=[P.TLimit(1):tinc:P.TLimit(2)-eps P.TLimit(2)];
end
costheta=cos(theta);
sintheta=sin(theta);
xdata=[];
ydata=[];
% no outer grid if outer tick is at outer RLimit
D.RGridN=length(P.RTickValue(P.RTickValue<P.RLimit(2)));
for k=1:D.RGridN
xdata=[xdata D.RTickRadius(k)*costheta NaN]; %#ok
ydata=[ydata D.RTickRadius(k)*sintheta NaN]; %#ok
end
if nargin<4 % new grid
D.HRGrid=line(xdata,ydata,...
'Parent',HAxes,...
'LineStyle',P.RGridLineStyle,...
'LineWidth',P.RGridLineWidth,...
'Color',P.RGridColor,...
'HandleVisibility','off',...
'HitTest','off');
else
set(D.HRGrid,'Xdata',xdata,'YData',ydata)
end
% Draw Rho Axis Tick Marks
phi=asin(P.TickLength./(2*D.RTickRadius));
tdata=[D.RTickAngle-phi; D.RTickAngle+zeros(size(D.RTickRadius))
D.RTickAngle+phi; NaN(size(D.RTickRadius))];
rdata=[D.RTickRadius; D.RTickRadius
D.RTickRadius; NaN(size(D.RTickRadius))];
xdata=rdata(:).*cos(tdata(:));
ydata=rdata(:).*sin(tdata(:));
if nargin==3 % new plot
D.HRTick=line(xdata,ydata,...
'Parent',HAxes,...
'LineStyle','-',...
'LineWidth',2*P.RGridLineWidth,...
'Color',P.BorderColor,...
'HandleVisibility','off',...
'HitTest','off');
else % old plot, update data
set(D.HRTick,'XData',xdata,'YData',ydata)
end
%--------------------------------------------------------------------------
function [P,D]=local_placeRTickLabel(HAxes,P,D,S)%#ok local_placeRTickLabel
% Draw Rho Tick Labels
D.RScale=floor(log10(max(abs(P.RTickValue))));
if abs(D.RScale)<2
D.RScale=0;
end
P.RTickLabel=cell(D.RTickLabelN,1);
if nargin==4 % delete old labels and create new ones
delete(D.HRTickLabel)
end
D.HRTickLabel=zeros(D.RTickLabelN,1);
for k=1:D.RTickLabelN
xdata=(P.RTickOffset+D.RTickRadius(k))*cos(D.RTickAngle);
ydata=(P.RTickOffset+D.RTickRadius(k))*sin(D.RTickAngle);
P.RTickLabel{k}=num2str(P.RTickValue(k)*10^(-D.RScale));
if (k==D.RTickLabelN) && (D.RScale~=0)
P.RTickLabel{k}=[P.RTickLabel{k} sprintf('\\times10^{%d}',D.RScale)];
end
D.HRTickLabel(k)=text(xdata,ydata,P.RTickLabel{k},...
'Parent',HAxes,...
'Color',P.TGridColor,...
'FontName',P.FontName,...
'FontSize',P.FontSize,...
'FontWeight',P.FontWeight',...
'HorizontalAlignment',P.RTickLabelHalign,...
'VerticalAlignment',P.RTickLabelValign,...
'Clipping','off',...
'HandleVisibility','off',...
'HitTest','off');
end
%--------------------------------------------------------------------------
function [P,D]=local_getRTickValue(HAxes,P,D,S) % local_getRTickValue
% get RTicks
if nargin==4 % updating current ticks given new rho axis limits
tmpaxes=axes('Position',get(HAxes,'Position'));
line([0 1],S.RLimit,'Parent',tmpaxes);
P.RTickValue=get(tmpaxes,'YTick');
P.RLimit=S.RLimit;
delete(tmpaxes) % got ticks, don't need axes anymore
end
%P.RTickValue(end)=P.RLimit(2); % place last tick at outer rho limit
NumRTick=length(P.RTickValue); % reduce ticks if too many
if NumRTick>6
if rem(NumRTick,2)~=0 % odd number keep alternate ones
P.RTickValue=P.RTickValue(1:2:end);
else % even number, add one tick, then keep alternate ones
if P.RTickValue(1)==0 % keep lowest tick if zero, add one at outside
P.RTickValue=[P.RTickValue(1:2:end-1) ...
2*P.RTickValue(end)-P.RTickValue(end-1)];
P.RTickValue(P.RTickValue>P.RLimit(2))=[]; % no label past limit
else % add one tick at inside
P.RTickValue=[2*P.RTickValue(1)-P.RTickValue(2)...
P.RTickValue(2:2:end)];
end
P.RLimit(1)=P.RTickValue(1); % make first tick lower axis limit
end
end
if NumRTick<3
m=sum(P.RTickValue)/2;
P.RTickValue(3)=P.RTickValue(2);
P.RTickValue(2)=m;
end
D.RLimitDiff=diff(P.RLimit);
D.RMin=P.RLimit(1);
if abs(P.RTickValue(1)-P.RLimit(1)) < abs(D.RLimitDiff)/100
P.RTickValue(1)=[]; % throw out inner tick if at inner axis limit
end
D.RTickRadius=(P.RTickValue-D.RMin)/D.RLimitDiff;
D.RTickLabelN=length(P.RTickValue);
%--------------------------------------------------------------------------
function [P,D]=local_placeTGrid(HAxes,P,D,S) %#ok local_placeTGrid
xdata=[];
ydata=[];
costheta=cos(D.TTickValue);
sintheta=sin(D.TTickValue);
% no grid on first or last ticks are axis limits if less than 4 quadrants
ki=1;
ke=length(D.TTickValue);
if abs(diff(P.TLimit))<2*(1-eps)*pi; % less than 4 quadrant box
ki=1+(D.TTickValue(1)==P.TLimit(1));
ke=length(D.TTickValue)-(D.TTickValue(end)==P.TLimit(2));
end
D.TGridN=ke-ki+1;
for k=ki:ke
xdata=[xdata 0 costheta(k) NaN]; %#ok
ydata=[ydata 0 sintheta(k) NaN]; %#ok
end
if nargin<4 % new grid
D.HTGrid=line(xdata,ydata,...
'Parent',HAxes,...
'LineStyle',P.TGridLineStyle,...
'LineWidth',P.TGridLineWidth,...
'Color',P.TGridColor,...
'HandleVisibility','off',...
'HitTest','off');
else
set(D.HTGrid,'Xdata',xdata,'YData',ydata)
end
% Draw Theta Axis Tick Marks
tdir=2*strcmp(P.TTickDirection,'in')-1;
tdata=[D.TTickValue; D.TTickValue; NaN(1,D.TTickLabelN)];
rdata=[ones(1,D.TTickLabelN)
(1-tdir*P.TickLength)+zeros(1,D.TTickLabelN)
NaN(1,D.TTickLabelN)];
xdata=rdata(:).*cos(tdata(:));
ydata=rdata(:).*sin(tdata(:));
if nargin==3 % new plot
D.HTTick=line(xdata,ydata,...
'Parent',HAxes,...
'LineStyle','-',...
'LineWidth',2*P.RGridLineWidth,...
'Color',P.BorderColor,...
'Clipping','off',...
'HandleVisibility','off',...
'HitTest','off');
else % old plot, update data
set(D.HTTick,'XData',xdata,'YData',ydata)
end
%--------------------------------------------------------------------------
function [P,D]=local_placeTTickLabel(HAxes,P,D,S)%#ok local_placeTTickLabel
% Draw Theta Ticks
if nargin==4 % delete old labels and create new ones
delete(D.HTTickLabel)
end
P.TTickLabel=cell(D.TTickLabelN,1);
D.HTTickLabel=zeros(D.TTickLabelN,1);
for k=1:D.TTickLabelN % label ticks at theta axis limits
xdata=(1+P.TTickOffset)*cos(D.TTickValue(k));
ydata=(1+P.TTickOffset)*sin(D.TTickValue(k));
if strcmp(P.TTickScale,'radians')
[n,d]=rat(P.TTickValue(k)/pi); % ticks as fractions
if n==0
Tstr='0';
elseif n==1 && d==1
Tstr='\pi';
elseif n==-1 && d==1
Tstr='-\pi';
elseif n==1
Tstr=['\pi/' num2str(d)];
elseif n==-1
Tstr=['-\pi/' num2str(d)];
elseif d==1
Tstr=[num2str(n) '\pi'];
else
Tstr=[num2str(n) '\pi/' num2str(d)];
end
P.TTickLabel{k}=Tstr;
else % degrees
P.TTickLabel{k}=[num2str(P.TTickValue(k)) '\circ'];
if P.TTickValue(k)==-180
P.TTickLabel{k}=['\pm' P.TTickLabel{k}(2:end)];
end
end
D.HTTickLabel(k)=text(xdata,ydata,P.TTickLabel{k},...
'Parent',HAxes,...
'Color',P.TGridColor,...
'FontName',P.FontName,...
'FontSize',P.FontSize,...
'FontWeight',P.FontWeight',...
'HorizontalAlignment','center',...
'VerticalAlignment','middle',...
'Clipping','off',...
'HandleVisibility','off',...
'HitTest','off');
end
%--------------------------------------------------------------------------
function [P,D]=local_getTTickValue(P,D,S) %#ok local_getTTickValue
% Get Theta Ticks
if strcmp(P.TTickScale,'degrees') % ticks are in degrees
TTick=0:P.TTickDelta:360; % possible ticks
if P.TLimit(1)>P.TLimit(2)
idx=TTick<=P.TLimit(2)*180/pi | TTick>=P.TLimit(1)*180/pi; % keepers
else
idx=TTick>=P.TLimit(1)*180/pi & TTick<=P.TLimit(2)*180/pi; % keepers
end
P.TTickValue=TTick(idx);
P.TTickValue=unique(rem(P.TTickValue,360)); % get unique ticks
D.TTickValue=P.TTickValue*pi/180; % store ticks in radians
if strcmp(P.TTickSign,'+-')
tmp=P.TTickValue>=180;
P.TTickValue(tmp)=P.TTickValue(tmp)-360;
end
else % ticks are in radians
TTick=(0:P.TTickDelta*180/pi:360)*pi/180; % possible ticks
if P.TLimit(1)>P.TLimit(2)
idx=TTick<=P.TLimit(2) | TTick>=P.TLimit(1); % keepers
else
idx=TTick>=P.TLimit(1) & TTick<=P.TLimit(2); % keepers
end
P.TTickValue=TTick(idx);
P.TTickValue=unique(rem(P.TTickValue,2*pi)); % get unique ticks
D.TTickValue=P.TTickValue; % store ticks in radians for plotting
if strcmp(P.TTickSign,'+-')
tmp=P.TTickValue>=pi;
P.TTickValue(tmp)=P.TTickValue(tmp)-2*pi;
end
end
D.TTickLabelN=length(D.TTickValue);
kmid=max(1,floor(length(P.TTickValue)/2));
P.RTickAngle=(D.TTickValue(kmid)+D.TTickValue(kmid+1))/2;
D.RTickAngle=P.RTickAngle;
if strcmp(P.TTickScale,'degrees')
P.RTickAngle=P.RTickAngle*180/pi;
end
%--------------------------------------------------------------------------
function out=local_getDefaults % local_getDefaults
out.Style='cartesian';
out.Axis='on';
out.Border='on';
out.Grid='on';
out.RLimit=[0 1];
out.TLimit=[0 2*pi];
out.RTickUnits='';
out.TTickScale='degrees';
out.TDirection='ccw';
out.TZeroDirection='east';
out.BackgroundColor=get(0,'defaultaxescolor');
out.BorderColor=[0 0 0];
out.FontName=get(0,'defaultaxesfontname');
out.FontSize=get(0,'defaultaxesfontsize');
out.FontWeight=get(0,'defaultaxesfontweight');
out.TickLength=0.02;
out.RGridColor=get(0,'defaultaxesycolor');
out.RGridLineStyle=get(0,'defaultaxesgridlinestyle');
out.RGridLineWidth=get(0,'defaultaxeslinewidth');
out.RGridVisible='on';
out.RTickAngle=0;
out.RTickOffset=0.04;
out.RTickLabel='0|0.5|1.0';
out.RTickLabelHalign='center';
out.RTickLabelValign='middle';
out.RTickLabelVisible='on';
out.RTickValue=[0 .5 1];
out.RTickVisible='on';
out.TGridColor=get(0,'defaultaxesxcolor');
out.TGridVisible='on';
out.TGridLineStyle=get(0,'defaultaxesgridlinestyle');
out.TGridLineWidth=get(0,'defaultaxeslinewidth');
out.TTickOffset=0.08;
out.TTickDelta=15;
out.TTickDirection='in';
out.TTickLabel='';
out.TTickLabelVisible='on';
out.TTickSign='+-';
out.TTickValue=0:15:359;
out.TTickVisible='on';
%--------------------------------------------------------------------------
% Description of Plot Data Stored Description of Plot Data Stored
%--------------------------------------------------------------------------
%
% VARIABLE TYPE DESCRIPTION
% D.TData Cell Raw input theta data
% D.RData Cell Raw input rho data
% D.RDataN Cell Normalized rho data
% D.LineColor Cell Line colors of plotted data
% D.LineStyle Cell Line styles of plotted data
% D.Marker Cell Markers of plotted data
% D.RLimitDiff Double Rho axis limit difference
% D.RMin Double Rho axis minimum
% D.RScale Double Power of ten scaling rho axis ticks
% D.RTickAngle Double Angle of rho tick labels in radians
% D.RTickRadius Double Radial position of rho tick labels
% D.RGridN Double Number of rho axis grid lines
% D.RTickLabelN Double Number of rho axis tick labels
% D.TGridN Double Number of theta axis grid lines
% D.TTickLabelN Double Number of theta axis tick labels
% D.TTickValue Double Theta tick values in RADIANS
%--------------------------------------------------------------------------
% Description of Stored Handles Description of Stored Handles
%--------------------------------------------------------------------------
%
% HANDLE TYPE DESCRIPTION
% D.HAPatch Patch Axis background and border
% D.HTTick Line Theta tick marks
% D.HRTick Line Rho tick marks
% D.HRGrid Line Rho grid
% D.HTTickLabel Text Theta Tick Labels
% D.HRTIckLabel Text Rho Tick Labels
% D.HLines Line Plotted Data
%
%--------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -