2

I tried to change the code in a way so that only the first area is shaded grey. How can I set the horizontal line in a way that it only appears under the area I want to shade?

Furthermore I want to calculate the area of ONE region. How do I achieve that? I know it is trapz but I am not sure how to set the boundaries. Thanks!

x = 0:.01:4*pi;  %// x data
y = sin(x);      %// y data
level = 0.5;     %// level
plot(x, y)
hold on
area(x, max(y, level), level, 'EdgeColor', 'none', 'FaceColor', [.7 .7 .7])

Curve:-
Curve

EBH
  • 10,350
  • 3
  • 34
  • 59
MatlabNewb
  • 757
  • 1
  • 6
  • 11

2 Answers2

3

you can try also this simple option:

x = 0:.01:4*pi;  %// x data
y = sin(x);      %// y data
level = 0.5;     %// level
lineStart = find(y>=level,1);
lineEnd = find(y(lineStart:end)<=level,1)+lineStart;
plot(x,y)
hold all
area(x(lineStart:lineEnd),y(lineStart:lineEnd),...
     level,'EdgeColor', 'none', 'FaceColor', [.7 .7 .7],'ShowBaseLine','off')
line([x(lineStart),x(lineEnd)],[level level ])
hold off

without defining areas of interest a-priory: Filling area

And don't forget to hold off...

To calaulate the area: A = trapz(x(lineStart:lineEnd),y(lineStart:lineEnd))

EBH
  • 10,350
  • 3
  • 34
  • 59
  • Thanks for your efforts mate! One question. What does the 1 mean in `lineStart = find(y>=level,1);` – MatlabNewb Jul 17 '16 at 12:23
  • It means 'look for the first time the condition is true', so it only gives the first increase of `y` above the the level – EBH Jul 17 '16 at 13:24
2

You can limit the range of your x axis in the area plot to the range of interest, e.g. from 0 to 4 and then calculate the resulting values of the function in this range. For the base line: you can hide it in the area command and add it manually using the line command.

x = 0:.01:4*pi;  %// x data
y = sin(x);      %// y data
level = 0.5;     %// level
plot(x, y)
hold on

x_interest = 0:.01:4;
y_interest = sin(x_interest);
area(x_interest, max(y_interest, level), level, ...
    'EdgeColor', 'none', 'FaceColor', [.7 .7 .7], ...
    'ShowBaseLine', 'off');
line( [ min(x_interest) max(x_interest) ], [ level level ] )

enter image description here

Matthias W.
  • 1,039
  • 1
  • 11
  • 23
  • Thank you very much! :) How can I know calculate the area of the given surface. Pretty sure it is trapz but am not sure about the boundaries. If I have no points given explicitly I probably need to use intersection. Any ideas from your side? – MatlabNewb Jul 17 '16 at 11:34
  • @Detox: you're right. I have missed that part of your question. Hope this helps: https://de.mathworks.com/matlabcentral/answers/15653-evaluating-the-area-between-two-curves – Matthias W. Jul 17 '16 at 11:40
  • Thanks! One last question. If I want to shade another area below my shaded in the picture but it is in the lower sector, area will also fill the sector between the two lines. How can I avoid such occurence? – MatlabNewb Jul 17 '16 at 11:46
  • @Detox: what do you mean? The same threshold, but under the line? I'd use an additional call to `area`, like this: `area(x_interest2, min(y_interest2, level), level, 'EdgeColor', 'none', 'FaceColor', [.7 .7 .7], 'ShowBaseLine', 'off');` -- and use `min` instead of `max`. – Matthias W. Jul 17 '16 at 11:49