ich habe einen Antennenvermessung gemacht. Nun wollte ich das ganze in einem schönen Polardiagramm plotten lassen. Funktioniert auch alles. Nur gefällt mir dir Plot nicht so recht. Im Anhnag ist der gewünschte Plot und der bis jetzige. Kann mir jemand sagen wie ich den Code abändern muss damit ich auch gestrichelte Linien bekomme?
Der Code Funktioniert wie folgt:
Messergebnisse:
Code:
figure;
theta =[-180-85-80-75-70-60-50-40-30-20-10010203040506070758085180];
rho=[8.8769.49.299.49.5110.1910.5511.8414.2315.3418.7616.2514.915.7817.217.215.313.1211.178.728.387.827.69];
dirplot(theta,rho,'--o');
title('Antenna Gain in dB');
function hpol = dirplot(theta,rho,line_style,params) % DIRPLOT Polar directivity plot. % A modification of The Mathworks POLAR function, DIRPLOT generates % directivity plots in the style commonly used in acoustic and RF work. % Features include: % 1. Plots -90 to +90 or -180 to +180 degrees based on range of input % THETA, with 0 degrees at top center. % 2. Produces semicircular plots when plot range is -90 to +90 degrees. % 3. RHO is assumed to be in decibels and may include negative % values. % 4. Default automatic rho-axis scaling in "scope knob" factors. % 5. Optional PARAMS argument allows manual setting of rho-axis % scaling. % % DIRPLOT(THETA, RHO) makes a plot using polar coordinates of the % angle THETA versus the radius RHO. THETA must be in degrees, and % must be within the range -180 to +180 degrees. If THETA is within % the range -90 to +90 degrees, the plot will be semicircular. RHO is % assumed to be in decibels and the values may be positive or negative or % both. By default, with no PARAMS argument, rho-axis scaling will be determined % automatically using scope knob factors of 1-2-5. By default, 10 % ticks will be plotted. Note: Like POLAR, DIRPLOT does not rescale the % axes when a new plot is added to a held graph.
%
% DIRPLOT(THETA, RHO, LINE_STYLE, PARAMS) makes a plot as described above % using the linestyle specified in string LINE_STYLE, and using the rho-axis % scaling specified in vector PARAMS. Either of these optional arguments may be % used alone. Vector PARAMS is a 3-element row vector defined as % [RHOMAX RHOMIN RHOTICKS]. String LINE_STYLE is the standard MATLAB linestyle % string. See PLOT for a description.
%
% HPOL = DIRPLOT(...) returns a handle to the LINE object generated by the PLOT % function that actually generates the plot in DIRPLOT. % % See also POLAR, PLOT, LOGLOG, SEMILOGX, SEMILOGY. % % Tested in MATLAB v. 6.0 (R12)
%
% Revision History % 18 January 2014: Fixed a bug that caused RHO to be plotted incorrectly if % RHOMIN was specified, and RHO was less than RHOMIN. Thanks to Wajih Elsallal. % 11 June 2012: Changed contact email address only % 18 January 2002: Original posting
%
% Adapted from The MathWorks POLAR function by % Steve Rickman % sxrickman@gmail.com
ifnargin <= 1 error('Requires 2, 3, or 4input arguments.') elseifnargin == 2
line_style = 'auto';
elseifnargin == 3 if isnumeric(line_style)
params = line_style;
line_style = 'auto';
end end ifexist('params') iflength(params) ~= 3 error('Argument PARAMS must be a 3-element vector: [RHOMAX RHOMIN RHOTICKS].') end if params(1) <= params(2) error('Error in PARAMS argument. RHOMAX must be greater than RHOMIN.') end if params(3) <= 0
params(3) = 1;
warning('Error in PARAMS argument. RTICKSset to 1.') end end if isstr(theta) | isstr(rho) error('THETA and RHO must be numeric.');
end if ~isequal(size(theta),size(rho)) error('THETA and RHO must be the same size.');
end if(max(theta) - min(theta)) < 6.3 warning('THETA must be in degrees');
end ifmin(theta) >= 0 warning('Plot is-90 to +90 or -180 to +180 degrees');
end ifmax(abs(theta)) > 180 error('Plot is-90 to +90 or -180 to +180 degrees');
end
% Get range of theta and set flag for full or half plot. if(max(theta)-min(theta)) > 180 | max(theta) > 90
fullplot = 1;
else
fullplot = 0;
end
% Translate theta degrees to radians
theta = theta*pi/180;
cax = newplot;
next = lower(get(cax,'NextPlot'));
hold_state = ishold;
% get x-axis text color so grid is in same color
tc = get(cax,'xcolor');
ls = get(cax,'gridlinestyle');
% Hold on to current Text defaults, reset them to the % Axes' font attributes so tick marks use them.
fAngle = get(cax, 'DefaultTextFontAngle');
fName = get(cax, 'DefaultTextFontName');
fSize = get(cax, 'DefaultTextFontSize');
fWeight = get(cax, 'DefaultTextFontWeight');
fUnits = get(cax, 'DefaultTextUnits');
set(cax, 'DefaultTextFontAngle', get(cax, 'FontAngle'), ...
'DefaultTextFontName', get(cax, 'FontName'), ...
'DefaultTextFontSize', get(cax, 'FontSize'), ...
'DefaultTextFontWeight', get(cax, 'FontWeight'), ...
'DefaultTextUnits','data')
% only do grids if hold is off if ~hold_state
% make a radial grid hold on;
if ~exist('params')
rticks = 10; % default ticks
lims = findscale(rho,rticks); % get click, rmax, rmin
click = lims(1); rmax = lims(2); rmin = lims(3);
rngdisp = rmax - rmin;
else
rmax = params(1); rmin = params(2); rticks = params(3);
rngdisp = rmax - rmin;
click = rngdisp/rticks;
% clip the data where RHO<rmin (bug fix Jan 2014) [m,n] = find(rho<rmin);
rho(m,n) = rmin;
end
set(cax,'userdata',[rngdisp rmax rmin]); % save variables for added plots
% define a circle
th = 0:pi/50:2*pi;
xunit = cos(th);
yunit = sin(th);
% now really force points on x/y axes to lie on them exactly
inds = 1:(length(th)-1)/4:length(th);
xunit(inds(2:2:4)) = zeros(2,1);
yunit(inds(1:2:5)) = zeros(3,1);
% plot background if necessary if ~isstr(get(cax,'color')),
patch('xdata',xunit*rngdisp,'ydata',yunit*rngdisp, ...
'edgecolor',tc,'facecolor',get(gca,'color'),...
'handlevisibility','off');
end
for i=click:click:rngdisp
tickt = i+rmin;
ifabs(tickt) < .001
tickt = 0;
end
ticktext = ['' num2str(tickt)];
hhh = plot(xunit*i,yunit*i,ls,'color',tc,'linewidth',1,...
'handlevisibility','off');
if i < rngdisp
text(i*c88,i*s88, ...
ticktext,'verticalalignment','bottom',...
'handlevisibility','off','fontsize',8) else text(i*c88,i*s88, ... [ticktext,' dB'],'verticalalignment','bottom',...
'handlevisibility','off','fontsize',8) end if fullplot
if i < rngdisp
text(i*c92,i*s92, ...
ticktext,'verticalalignment','bottom',...
'handlevisibility','off','fontsize',8) else text(i*c92,i*s92, ... [ticktext,' dB'],'verticalalignment','bottom',...
'handlevisibility','off','fontsize',8) end end end set(hhh,'linestyle','-')% Make outer circle solid
% plot spokes at 10 degree intervals
th = (0:18)*2*pi/36;
% label spokes in 30 degree intervals
rt = 1.1*rngdisp;
for i = 1:3:19 text(rt*cst(i),rt*snt(i),[int2str(90-(i-1)*10),'^o'],...
'horizontalalignment','center',...
'handlevisibility','off');
end if fullplot
for i = 3:3:6 text(-rt*cst(i+1),-rt*snt(i+1),[int2str(-90-i*10),'^o'],...
'horizontalalignment','center',...
'handlevisibility','off');
end for i = 9:3:15 text(-rt*cst(i+1),-rt*snt(i+1),[int2str(270-i*10),'^o'],...
'horizontalalignment','center',...
'handlevisibility','off');
end end
% set view to 2-D view(2);
% set axis limits if fullplot
axis(rngdisp*[-11-1.151.15]);
else axis(rngdisp*[-1101.15]);
end end
if hold_state
v = get(cax,'userdata');
rngdisp = v(1);
rmax = v(2);
rmin = v(3);
end
% transform data to Cartesian coordinates. % Rotate by pi/2 to get 0 degrees at top. Use negative % theta to have negative degrees on left.
xx = (rho+rngdisp-rmax).*cos(-theta+pi/2);
yy = (rho+rngdisp-rmax).*sin(-theta+pi/2);
% plot data on top of grid ifstrcmp(line_style,'auto')
q = plot(xx,yy);
else
q = plot(xx,yy,line_style);
end ifnargout > 0
hpol = q;
end set(gca,'dataaspectratio',[111]), axis off; set(cax,'NextPlot',next);
set(get(gca,'xlabel'),'visible','on') set(get(gca,'ylabel'),'visible','on')
% Subfunction finds optimal scaling using "scope knob" % factors of 1, 2, 5. Range is limited to practical % decibel values. function lims = findscale(rho, rticks)
clicks = [.001 .002 .005 .01 .02 .05 .1...
.2 .51251020501002005001000];
lenclicks = length(clicks);
rhi = max(rho);
rlo = min(rho);
rrng = rhi - rlo;
rawclick = rrng/rticks;
n = 1;
while clicks(n) < rawclick
n = n + 1;
if n > lenclicks
close;
error('Cannot autoscale; unrealistic decibel range.');
end end
click = clicks(n);
m = floor(rhi/click);
rmax = click * m;
if rhi - rmax ~= 0
rmax = rmax + click;
end
rmin = rmax - click * rticks;
% Check that minimum rho value is at least one tick % above rmin. If not, increase click value and % rescale. if rlo < rmin + click
if n < lenclicks
click = clicks(n+1);
else error('Cannot autoscale; unrealistic decibel range.');
end
m = floor(rhi/click);
rmax = click * m;
if rhi - rmax ~= 0
rmax = rmax + click;
end
rmin = rmax - click * rticks;
end
lims = [click rmax rmin];
Ich hätte gerne das dass Polardiagramm aus gestrichelten Linien aufgebaut ist. Ich finde das dann die eingetragen Kurve (wenn diese nicht gestrichelt ist) besser zu erkennen ist. Desweiteren hat man dann in der Mitte nicht so einen dominanten schwarzen Sternpunkt wo alle Koordinaten Linien zusammenkommen.
In dem geposteten Code von dirplot findest Du einen
patch
und einen
plot
Befehl um die Gitter-Linien zu zeichnen. Dort kannst Du auch den LineStyle festelegen, um so ein gestricheltes Gitter zu bekommen.
Der Stern in der Mitte wird weniger prägnant, wenn Du weniger Linien verwendest und die Farbe auf grau stellst. Dazu musst Du dies im PATCH Befehl ändern:
Das ist sehr tückisch und zeitraubend, denn es sucht auch nach dem File "param.m" im Matlab-Pfad, nach Java-Klassen usw. EXIST() ohne Spezifikation wonach man sucht, sollte man unbedingt vermeiden.
if ~isstr(get(cax,'color')),
patch('xdata',xunit*rngdisp,'ydata',yunit*rngdisp, ...
'edgecolor',tc,'facecolor',get(gca,'color'),...
'handlevisibility','off');
end
Zu deiner Frage ob ich es mal mit polarplot versucht habe, lautet die Antwort nein. Aufgrund das ich ja viele Werte einlese und dies dann verbunden sein sollten dachte ich das es so am einfachsten geht.
Verwende den Debugger: Setze einen Breakpoint in die erste Zeiele und gehe Zeile für Zeile durch den Code. So findest Du den Befehl, der die Koordinaten zeichnet. In diesem Befehl kannst Du dann auch die Farben ändern.
In der Zeile "th = 0:pi/50:2*pi;" wird die Anzahl der Speichen festgelegt, nehme ich an.
Versuche doch mal:
Diese Funktion hat gar nichts mit dem DIRPLOT-Code zu tun. Es ist eine Unterfunktion von Matlab, die eine Figure kurz aufblinken lässt.
Wie Du an dem Copyright-Vermerk siehst, besitzt MathWorks an diesem Code das CopyRight. Deshalb habe ich ihn aus dem Forum entfernt.
Die Anzahl der Achsen habe ich auch nicht ändern können. Dieser Code ist echt kompliziert.
Welche Achsen meinst Du genau und warum hat welcher Versuch nicht funktioniert?
Hast Du den Code-Abschnitt gefunden mit dem Kommentar: "plot spokes at 10 degree intervals"? Bedauerlicherweise sind die Beschriftungen hard-codiert, so dass hier eine Änderung mühselig ist.
Wieso möchtest Du nicht mit Matlab's
polarplot
arbeiten?
Oh ok, Entschuldigung das wusste ich nicht. Ich würde schon mit dem polarrplot von Matlab arbeiten. Ich bin durch Zufall über diesen anderen Code gestolpert. Dieser bietet mir den Vorteil das ich meine Messergebnisse einfach einlese und das Schriftsteller dieses Codes schon die Achsen mit dbi angepasst hat. Sonst würde nicht gegen polarplot sprechen.
Das Problem ist das beim Polarplot mir die Linien Kreuz und Quer liegen siehe Bild. Und ich keine Achsenskalierung habe.
Mein Code sieht folgendermaßen für den Polarplot aus für den Polarplot welcher noch nicht optimal läuft.
Wegen deiner Frage was ich am Dir Plot anders wollte. Ich wollte nur die Inneren Linien der Achsen in Grau, so das der Plot ein wenig deutlicher herauskommt und die Mitte nicht mehr so dominant schwarz wirkt.
Wenn kein direkter Bezug zum vorherigen Thema besteht, bitte in Zukunft ein neues aufmachen.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.