Shading area between 2 curves (x function in terms of y)

6 visualizaciones (últimos 30 días)
rezheen
rezheen el 25 de Jun. de 2025
Editada: rezheen el 1 de Jul. de 2025
Hello, I'm trying to shade an area between two functions (x depending on y), I shade the correct area but I get a reflection of that shaded region possibly about the line y=x. I don't want this reflection in my graph, I only want the shaded region. Here's my code:
syms x y
x1=y^2; x2=y^3; y1=0; y2=1; % y1 & y2 are the boundaries
fp1 = fplot(x1, [y1 y2]); hold on; grid on;
fp2 = fplot(x2, [y1 y2]);
ylim('padded')
x1 = fp1.XData;
y1 = fp1.YData;
x2 = fp2.XData;
y2 = fp2.YData;
patch([y1 fliplr(y2)], [x1 fliplr(x2)], 'g'); hold off;

Respuesta aceptada

Paul
Paul el 25 de Jun. de 2025
Movida: Paul el 25 de Jun. de 2025
Here are the plots of the functions. The independent variable is y, which spans the x-axis on the fplot
syms x y
x1=y^2; x2=y^3; y1=0; y2=1; % y1 & y2 are the boundaries
fp1 = fplot(x1, [y1 y2]); hold on; grid on;
fp2 = fplot(x2, [y1 y2]);
ylim('padded')
xlabel('y')
ylabel('x')
To shade the region in between we have to note that the xdata is actually the YData of the plot and the ydata is actually the XData of the plot, because we are plotting x = f(y);
figure
fp1 = fplot(x1, [y1 y2]); hold on; grid on;
fp2 = fplot(x2, [y1 y2]);
ylim('padded')
xlabel('y')
ylabel('x')
%x1 = fp1.XData;
%y1 = fp1.YData;
%x2 = fp2.XData;
%y2 = fp2.YData;
y1 = fp1.XData;
x1 = fp1.YData;
y2 = fp2.XData;
x2 = fp2.YData;
patch([y1 fliplr(y2)], [x1 fliplr(x2)], 'g'); hold off;
  8 comentarios
Paul
Paul el 30 de Jun. de 2025
I don't understand what you want to do for the three-curve case. How should y3 = 2 influence the result?
rezheen
rezheen el 1 de Jul. de 2025
Editada: rezheen el 1 de Jul. de 2025
@Paul: y1 to y3 are the limits of integration and the functions are x depending on y. The intersection points of x=3-y, with x=2*sqrt(y) is at y=1 and 3-y and (y-1)^2 intersect at y=2, so I plotted them based on those intersection points, sort of patching all three curves together. @the cyclist's 'visible off' method allowed me to just plot the patched areas where they're filled, but with the code you provided, I got an incorrect plotting of the curve x=2*sqrt(y) or an additional curve underneath it that I wasn't able to get rid of. Both of your codes are great and I used them for different purposes.

Iniciar sesión para comentar.

Más respuestas (2)

the cyclist
the cyclist el 25 de Jun. de 2025
Editada: the cyclist el 25 de Jun. de 2025
I think you got yourself -- and me -- confused by swapping the definitions of what are conventionally called the X- and Y-axis.
Is this what you want? Or did you want the lower one?
syms x y
% Note that I changed the function definitions in this line
x1=y^(1/2); x2=y^(1/3); y1=0; y2=1; % y1 & y2 are the boundaries
fp1 = fplot(x1, [y1 y2]); hold on; grid on;
fp2 = fplot(x2, [y1 y2]);
ylim('padded')
x1 = fp1.YData; % In these lines, you need to be careful that MATLAB calls
y1 = fp1.XData; % the horizontal axis "X", but that is what you call "Y".
x2 = fp2.YData;
y2 = fp2.XData;
patch([y1 fliplr(y2)], [x1 fliplr(x2)], 'g'); hold off;

the cyclist
the cyclist el 29 de Jun. de 2025
Editada: the cyclist el 30 de Jun. de 2025
Another (I think simpler) method is to change the "view" of the axes.
This way the XData and YData properties of line up with what you expected. If you label your axes -- which you should -- then those do need to be swapped (because of the view change).
syms x y
x1=y^2; x2=y^3; y1=0; y2=1; % y1 & y2 are the boundaries
fp1 = fplot(x1, [y1 y2]); hold on; grid on;
fp2 = fplot(x2, [y1 y2]);
xlim('padded')
x1 = fp1.XData;
y1 = fp1.YData;
x2 = fp2.XData;
y2 = fp2.YData;
patch([x1 fliplr(x2)],[y1 fliplr(y2)],'g');
xlabel("y")
ylabel("x")
view([90 -90])

Etiquetas

Productos


Versión

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by