MATLAB Answers

Filling the area between curves (loglog)

2 views (last 30 days)
V.D-C
V.D-C on 1 Sep 2020
Answered: V.D-C on 2 Sep 2020
Hello,
I would like to fill the area between the two lines (on the interval 10^-2 & 10^-1):
I tried creating my own polygon using "patch" but I wondered if there is any better and more straightforward option ?
I tried using "fill" with different options but I couldn't make it work.
load('Area_glaciers_scandinavia.mat');
% Create log bins that span from 0.01 to 10000 km2
cc = 10.^(-2:0.1:4);
% Create the histogram of those bins (count nb of glacier/bin)
H = hist(area,cc);
figure()
loglog(cc,H)
idx(1) = find(roundn(cc,-4)==0.1259); %put the boundaries of the linear part of the curve)
idx(2)= find(roundn(cc,-2)==19.95);
%use polyfit
%we use log10 because we are looking for the exponents
P = polyfit(log10(cc(idx)), log10(H(idx)),1);
cf = polyval(P,log10(cc));
hold on
loglog(cc,10.^cf);

  2 Comments

KSSV
KSSV on 1 Sep 2020
Show us the code how you have plotted this. So that people can pick up that code and help you.

Sign in to comment.

Accepted Answer

V.D-C
V.D-C on 2 Sep 2020
Not very elegant, but I found that the best solution was to create manually:
x = [cc(1:idx(1)) fliplr(cc(1:idx(1)-1))];
y = [10.^cf(1:idx(1)) fliplr(H(1:idx(1)-1))];
patch(x,y,'g')

  0 Comments

Sign in to comment.

More Answers (1)

David Wilson
David Wilson on 2 Sep 2020
Edited: David Wilson on 2 Sep 2020
I too had some difficulty to do this elgantly. I changed the name of your data file, and commented out the material that didn't work.
%% patch in loglog plots
load('glacier_Data.mat');
%{
% Create log bins that span from 0.01 to 10000 km2
cc = 10.^(-2:0.1:4);
% Create the histogram of those bins (count nb of glacier/bin)
H = hist(area,cc);
figure()
%}
loglog(cc,H)
idx(1) = find(roundn(cc,-4)==0.1259); %put the boundaries of the linear part of the curve)
idx(2)= find(roundn(cc,-2)==19.95);
%use polyfit
%we use log10 because we are looking for the exponents
P = polyfit(log10(cc(idx)), log10(H(idx)),1);
cf = polyval(P,log10(cc));
loglog(cc,H, ...
cc,10.^cf);
grid on
Now try on a linear plot. (Just for testing)
%% Now do the shading on a linear plot
logcc = log10(cc); logH = log10(H);
idx = find(cc<1e-1);
xp = [logcc(idx), fliplr(logcc(idx))];
yp = [cf(idx), fliplr(logH(idx))]
plot(logcc, logH, ...
logcc, cf, '--')
patch(xp, yp, 'y')
Now try, as requested on a log plot. It's certainly not elegant, but does work.
%% Now try on log scale
loglog(cc,H, ...
cc,10.^cf);
h=patch(10.^xp, 10.^yp, 'y', 'faceAlpha', 0.5)
grid on
This gives the following:

  1 Comment

V.D-C
V.D-C on 2 Sep 2020
Hi, thanks for your answer but I managed to do it without changing the code as you did, and it goes to the intersection between the two plots.
You showed me the way though ! Thank you for that !

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!