# How to fill the area between two curves on a polar plot?

156 views (last 30 days)

Show older comments

My code looks is below. I attached the two curves it generates, with the data that I have. How can I fill the space between the two curves?

t=data(1,:);

a1=data(11,:);

b1=data(12,:);

r_scale=50;

line_width=2;

font_size=12;

marker = 3;

figure(1)

polarplot(t,a1,'-or','MarkerSize',2)

hold on

polarplot(t,b1,'-ok','MarkerSize',2)

hold on

##### 0 Comments

### Accepted Answer

Star Strider
on 18 May 2017

Yes!

Yours are different. Yours are also an easier problem.

I set up everything in polar coordinates in that code, then used the pol2cart function to create Cartesian representations for them, and plotted them in Cartesian space. My code drew the polar coordinates the same way. It did not use polar or polarplot, since they do not offer the necessary options.

Set your data up in polar coordinates, use pol2cart, patch, then plot.

Use the Plot Full Circumference and Plot Radials section in my code your referred to, to plot the polar coordinate grid. Use the text function for the radial and angle labels if you want them. Use the values in the grid plotting part of my earlier code to get the (x,y) values for your text calls.

This code snippet should get you started:

theta = linspace(0, 2*pi, 18); % Create Data (Angles)

Data1 = rand(1, 18)*0.5 + 0.5; % Create Data (First Radius)

Data2 = rand(1, 18)*0.5; % Create Data (Second Radius)

[x1, y1] = pol2cart(theta, Data1); % Convert To Cartesian

[x2, y2] = pol2cart(theta, Data2);

figure(1)

patch([x1 fliplr(x2)], [y1 fliplr(y2)], 'g', 'EdgeColor','g') % Fill Area Between Radius Limits

hold on

plot(x1, y1, '-k')

plot(x2, y2, '-r')

hold off

axis equal

Experiment to get the result you want. Post back if you have problems. I’ll do my best to help.

##### 12 Comments

### More Answers (2)

Nate Roberts
on 27 Oct 2021

Edited: Nate Roberts
on 28 Oct 2021

I wrote a function that overlays a transparent cartesian axis over the polar axis. This may be cheating a little bit, but it gets the job done and looks nice:

theta = linspace(0,2*pi,180);

rho = 10*ones(size(theta));

f = figure('Color','White');

p = polarplot(theta,rho); rlim([0,15]);

polarfill(gca,theta,rho-normrnd(2,0.2,size(rho)),rho+normrnd(2,0.2,size(rho)),'blue',0.6)

function polarfill(ax_polar,theta,rlow,rhigh,color,alpha)

ax_cart = axes();

ax_cart.Position = ax_polar.Position;

[xl,yl] = pol2cart(theta,rlow);

[xh,yh] = pol2cart(fliplr(theta),fliplr(rhigh));

fill([xl,xh],[yl,yh],color,'FaceAlpha',alpha,'EdgeAlpha',0);

xlim(ax_cart,[-max(get(ax_polar,'RLim')),max(get(ax_polar,'RLim'))]);

ylim(ax_cart,[-max(get(ax_polar,'RLim')),max(get(ax_polar,'RLim'))]);

axis square; set(ax_cart,'visible','off');

end

See also my answer to a similar question. It is a more general solution than the one posted here: https://www.mathworks.com/matlabcentral/answers/325599-fill-area-between-two-polar-curves#answer_818408

##### 1 Comment

Arthur Vieira
on 20 Jun 2022

Walter Roberson
on 18 May 2017

Unfortunately that does not appear to be possible. surface() and patch() specifically reject being children of PolarAxes; and fill() and area() and mesh() [none of which are primitives] fail when calling newplot() with newplot() rejecting making a cartesian child of a polar axes.

The actual drawing of polarplot() is by calling plot(), the implementation of which is now private.

### See Also

### Categories

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!