Creating beautiful polar coordinate plots in MATLAB

Published: June 01, 2015

For a problem that I'm currently working on, I found myself having to visualize some antenna patterns using MATLAB. To create polar coordinate plots, MATLAB offers the polar method, which is unfortunately quite limited in functionality. For this reason, Duane Hanselman created mmpolar, which brings MATLAB's extensive handle graphics capabilities to polar plots.

I wanted to create some antenna pattern plots with a light grey background and white grid lines, a color theme which is heavily inspired by Stanford's seaborn library for python/matplotlib. One problem that I faced was that mmpolar by default sets the color of the axis tick labels to the color of the axis grid lines. This meant that whenever I set the grid lines to be white, my tick labels would disappear in the white figure background, which was obviously quite undesirable.

I wrote a small patch to fix this problem: It adds a TickLabelColor property to each axis, which can be different from the GridColor property, which controls the grid line color. Specifically, to set the color of the angle axis, I can now set the TTickLabelColor property and to set the color of the amplitude axis, I can set the RTickLabelColor property. Much better.

The results look like this:


Below is the 'plotting part' of my script that is used to generate the above plot:

% plot the results using mmpolar
gridWidth = 1.5;
fontSize = 15;
fig = figure();
% first, the intermediate ones
interm_handle = mmpolar(patterns.angle_axis, patterns.f(:,1:end-1), ...
                        'Color', seaborn6(2), ...
                        'LineStyle', '--');
% now the optimal one
hold on
opt_handle = mmpolar(patterns.angle_axis, patterns.fopt, ...
                     'Color', seaborn6(3), ...
                     'LineStyle', '-.');
% now the result of the algo, also configure looks of the plot
res_handle = mmpolar(patterns.angle_axis, patterns.f(:,end), ...
                     'Color', seaborn6(1), ...
                     'LineStyle', '-', ...
                     'BackgroundColor', [0.9176470588 0.9176470588 0.9490196078], ...
                     'Style', 'compass',...
                     'BorderColor', 'white', ...
                     'FontSize', fontSize, ...
                     'RTickLabelVisible', 'off', ...
                     'RGridColor', 'white', ...
                     'RGridLineStyle', '-', ...
                     'RGridLineWidth', gridWidth, ...
                     'TTickLabelVisible', 'on', ...
                     'TGridColor', 'white', ...
                     'TTickLabelColor', 'k', ...
                     'TGridLineStyle', '-', ...
                     'TGridLineWidth', gridWidth);

% set the line widths
set(res_handle(1:end-2), 'LineWidth', 1.5); % the intermediate results
set(res_handle(end-1), 'LineWidth', 5); % the optimal value
set(res_handle(end), 'LineWidth', 3); % the final result

% legend
leg = legend([res_handle(1) res_handle(end-1) res_handle(end)], ...
             'Intermediate', 'Optimum', 'Final Result');
set(leg, 'Location', 'SouthOutside');
set(leg, 'Orientation', 'horizontal');
set(leg, 'EdgeColor', 'white');
set(leg, 'FontSize', fontSize);

% figure settings
% need this to print the actual background color
set(fig, 'Color', 'white');
set(fig, 'InvertHardCopy', 'off');
% set the size
xdim = 8;
ydim = 8;
%set(fig, 'PaperUnits', 'normalized');
set(fig, 'PaperSize', [xdim ydim]);
set(fig, 'PaperPositionMode', 'manual');
set(fig, 'PaperPosition', [0 0 xdim ydim]);

% print to file
fn = sprintf('%s/Summed_Pattern_0dBSNR', plotsDir);
print(gcf, fn, '-depsc')

To apply the patch, download mmpolar and the patch from the links posted above, make sure they are in the same directory and run

patch < mmpolar_color_labels.patch

After that, make sure to put mmpolar.m in a directory that is listed in MATLAB's path variable.

I hope this can be useful for someone!