Заштриховать и рассчитать конкретную область

Я попытался изменить код таким образом, чтобы только первая область была закрашена серым цветом. Как настроить горизонтальную линию так, чтобы она отображалась только под областью, которую я хочу затенить?

Кроме того, я хочу рассчитать площадь ОДНОГО региона. Как мне этого добиться? Я знаю, что это trapz, но не знаю, как установить границы. Спасибо!

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])

Кривая:-
Кривая


person MatlabNewb    schedule 17.07.2016    source источник


Ответы (2)


вы также можете попробовать этот простой вариант:

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

без предварительного определения областей интереса: Область заполнения

И не забудьте hold off...

Чтобы рассчитать площадь: A = trapz(x(lineStart:lineEnd),y(lineStart:lineEnd))

person EBH    schedule 17.07.2016
comment
Спасибо за ваши усилия, приятель! Один вопрос. Что означает 1 в lineStart = find(y>=level,1); - person MatlabNewb; 17.07.2016
comment
Это означает «искать в первый раз, когда условие истинно», поэтому оно дает только первое увеличение y выше уровня - person EBH; 17.07.2016

Вы можете ограничить диапазон оси x на графике area до интересующего диапазона, например. от 0 до 4, а затем вычислить результирующие значения функции в этом диапазоне. Для базовой линии: вы можете скрыть ее в команде area и добавить вручную с помощью команды line.

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 ] )

введите здесь описание изображения

person Matthias W.    schedule 17.07.2016
comment
Большое спасибо! :) Как я могу вычислить площадь данной поверхности. Почти уверен, что это trapz, но я не уверен в границах. Если у меня нет точек, указанных явно, мне, вероятно, нужно использовать пересечение. Есть идеи с вашей стороны? - person MatlabNewb; 17.07.2016
comment
@Detox: ты прав. Я пропустил эту часть вашего вопроса. Надеюсь, это поможет: de.mathworks.com/ matlabcentral/ответы/ - person Matthias W.; 17.07.2016
comment
Спасибо! И последний вопрос. Если я хочу затенить другую область ниже моей заштрихованной на картинке, но она находится в нижнем секторе, область также заполнит сектор между двумя линиями. Как я могу избежать такого случая? - person MatlabNewb; 17.07.2016
comment
@Detox: что ты имеешь в виду? Тот же порог, но под чертой? Я бы использовал дополнительный вызов area, например: area(x_interest2, min(y_interest2, level), level, 'EdgeColor', 'none', 'FaceColor', [.7 .7 .7], 'ShowBaseLine', 'off'); -- и использовал бы min вместо max. - person Matthias W.; 17.07.2016