이 질문을 팔로우합니다.
- 팔로우하는 게시물 피드에서 업데이트를 확인할 수 있습니다.
- 정보 수신 기본 설정에 따라 이메일을 받을 수 있습니다.
Fill area between two curves
조회 수: 14 (최근 30일)
이전 댓글 표시
Hello,
I am tring to fill the area between the two ellipses. I am importing the values from Excel to plot the figure. After that I would like to fill the two ellipses with two different colors. How do I do that?.
CODE:
clc
clear all
load Phase12.mat
x = Phase1.x;
y = Phase1.z;
plot(x,y);
fill(x,y,'g');
hold on
a = Phase1.a;
b = Phase1.b;
plot(a,b);
% fill(a,b,'q')
x,y,a and b are the names of the four columns that I have imported from excel. x,y represents the bigger ellipse. I tried using some of the patch codes, but it did not work out. Can someone please help me with this?
댓글 수: 1
Adam Danz
2021년 4월 2일
Just FYI so you don't have to wait for your answers in the future, this topic has been addressed many times in the forum and there is a clear example in the patch documentation.
채택된 답변
Star Strider
2021년 2월 16일
Try something like this:
t = linspace(0, 2*pi);
x = ([1;2]*cos(t)).'; % Produces (Nx2) Matrix
y = ([1;2]*sin(t)).'; % Produces (Nx2) Matrix
figure
patch([x(:,2); flipud(x(:,1))], [y(:,2); flipud(y(:,1))], 'g', 'EdgeColor','none') % Create ‘patch’ Object
hold on
plot(x(:,1), y(:,1), '-r') % Circle Outlines
plot(x(:,2), y(:,2), '-r') % Circle Outlines
hold off
axis('equal')
If your data are row vectors, do this:
patch([x fliplr(a)], [y fliplr(b)], 'g')
If they are column vectors:
patch([x; flipud(a)], [y; flipud(b)], 'g')
That should work.
댓글 수: 36
Shri Harsha Bharadwaj
2021년 2월 16일
편집: Shri Harsha Bharadwaj
2021년 2월 16일
Hello,
Thanks for the quick reply. I am a beginner in MATLAB. So, in the code that you have written above where does my data come into play. It does not right?. What you have in the top is just a similar example where you have used two equations to generate the circles. How do I generate something similar using my data?
Also adding
patch([x; flipud(a)], [y; flipud(b)], 'g')
to the code I have above, gives me the image attached.
while
patch([x fliplr(a)], [y fliplr(b)], 'g')
does not change anything.
Do you think there is some issue while exporting my data from EXCEL?. Its just 4 columns of data ( x,y,a and b respectively).
Star Strider
2021년 2월 16일
My code should work.
Attach your data so I can see what the problem is with it.
Shri Harsha Bharadwaj
2021년 2월 16일
Hello,
Thanks again for the quick response. Attached is the excel sheet that I import to create the plots.
Star Strider
2021년 2월 17일
편집: Star Strider
2021년 2월 17일
My pleasure!
There are NaN values in some of your data. That was the problem.
This works:
T1 = readtable('3Phase1.csv', 'VariableNamingRule','preserve');
xz = [T1.x T1.z]; % Concatenate Vectors
xz = xz(~any(isnan(xz),2),:); % Remove ‘NaN’ Rows
ab = [T1.a T1.b]; % Concatenate Vectors
ab = ab(~any(isnan(ab),2),:); % Remove ‘NaN’ Rows
figure
patch([xz(:,1); flipud(ab(:,1))], [xz(:,2); flipud(ab(:,2))], 'g', 'EdgeColor','none') % Create ‘patch’ Object
hold on
plot(xz(:,1), xz(:,2), '-b') % Curve Outlines
plot(ab(:,1), ab(:,2), '-b') % Curve Outlines
hold off
axis('equal')
producing:
It is easier to concatenate the vectors into their respective matrices in order to remove the NaN values.
Other than removing the NaN values and adapting my code to your variables, my original code is essentially unchanged.
Shri Harsha Bharadwaj
2021년 2월 17일
편집: Shri Harsha Bharadwaj
2021년 2월 17일
Thank you Sir. I really appreciate the help.
I just had one more question. If I wanted to color the smaller ellipse in the center, would I have to do something similar to this?
Again, I cannot tell you how helpful this has been. I will look some of these commands up in detail to understand what actually is happening in the code.
Star Strider
2021년 2월 17일
My pleasure!
‘If I wanted to color the smaller ellipse in the center, would I have to do something similar to this?’
Yes, however it would be easier. To fill the inner curve, simply add this patch call:
patch(ab(:,1), ab(:,2), 'r') % Fill Inner Curve
so the slightly revised, complete code is now:
T1 = readtable('3Phase1.csv', 'VariableNamingRule','preserve');
xz = [T1.x T1.z]; % Concatenate Vectors
xz = xz(~any(isnan(xz),2),:); % Remove ‘NaN’ Rows
ab = [T1.a T1.b]; % Concatenate Vectors
ab = ab(~any(isnan(ab),2),:); % Remove ‘NaN’ Rows
figure
patch([xz(:,1); flipud(ab(:,1))], [xz(:,2); flipud(ab(:,2))], 'g', 'EdgeColor','none') % Create ‘patch’ Object
hold on
plot(xz(:,1), xz(:,2), '-b') % Curve Outlines
plot(ab(:,1), ab(:,2), '-b') % Curve Outlines
patch(ab(:,1), ab(:,2), 'r') % Fill Inner Curve
hold off
axis('equal')
producing:
Of course, choose whatever line colours and inner-curve fill colour you want.
Shri Harsha Bharadwaj
2021년 2월 17일
Hello Sir,
Thanks a lot for all the help you have provided me with this. I really appreciate it. It works perfectly. I will make some modifications with respect to the colours.
Is it okay if I keep the question open, so that I can ask you if I have any more questions?
Thanks a ton again.
Star Strider
2021년 2월 17일
My pleasure!
It will be open as long as you want it to be. I will continue to respond as best I can.
Meanwhile, it appears that I did solve the problem as originally posted. If my Answer helped you solve your problem, please Accept it!
.
Shri Harsha Bharadwaj
2021년 2월 17일
편집: Shri Harsha Bharadwaj
2021년 2월 17일
Thanks a lot. I will do the same.
Shri Harsha Bharadwaj
2021년 3월 21일
Hope you are doing well. I have been trying to remove the empty cells when plotting, but I have been having some issues.
When I plot the graph in Excel, I get the image attached below.
But when I import the same thing and try to plot it in MATLAB, I see a line.
I have been using your code from before. Can you please help me out with this?
clc
clear all
T1 = readtable('0.1399s.xlsx', 'VariableNamingRule','preserve');
YZ = [T1.Y T1.Z];
YZ = YZ(~any(isnan(YZ),2),:);
figure
plot(YZ(:,1),YZ(:,2),'b')
patch(YZ(:,1),YZ(:,2),'b')
Star Strider
2021년 3월 21일
The problem is that the ‘x’ coordinate ‘crosses over’ at that point, and nothing I can come up with (sort, sortrows, unique) fixes it.
This fixes the plot:
k = boundary(YZ(:,1), YZ(:,2), 0.95);
with:
patch(YZ(k,1),YZ(k,2),'b')
however I have no idea how to fix the underlying data. The boundary function was introduced in R2014b.
Shri Harsha Bharadwaj
2021년 3월 22일
Thanks for the quick reply sir. I am not too worried about the data. I have the images now properly. Thank you.
Shri Harsha Bharadwaj
2021년 3월 23일
편집: Shri Harsha Bharadwaj
2021년 3월 23일
Sir, if I wanted to compute the area of the irregular shape seen above, how would I do it?
Most of what I found have something to do with image processing, which I believe is not required for me, as my shape is already on the axes.
polyarea() gives me area for a polygon. I could not find anything for my case. Can you please help me out with this?
It tried using area(), but that does not seem to work either.
Star Strider
2021년 3월 23일
Both trapz and polyarea work here, with reapect to the boundary call result. The area function would not work here because it produces an area plot.
The area given by trapz:
Area = trapz(YZ(k,1),YZ(k,2))
Area =
-9.872788536391784e-07
and by polyarea:
AreaP = polyarea(YZ(k,1),YZ(k,2))
AreaP =
9.872788536391784e-07
differ only in the sign of the result. The magnitudes are the same.
(I would not use the original data because of the sign-reversal in ‘YZ(:,1)’ that caused problems for the patch call.)
Choose whichever result works best in your application.
Shri Harsha Bharadwaj
2021년 4월 5일
편집: Shri Harsha Bharadwaj
2021년 4월 5일
@Star Strider Hello sir,
I am trying to compute the perimeter of these irregular shapes. I came across a reference code to do that.
% Contour coordinates
A=xlsread('justplastic0.5.xlsx','A1:B100');
% Compute perimeter
N=size(A,1);
D=A(:,2:N)-A(:,1:(N-1));
D=sqrt(sum(D.^2,2)); % edge lenghts
P=sum(D); % perimeter
But I get wrong numbers with the code above.
Essentially, I am trying to figure out the Circularity of these blobs. Hence, I am trying to compute the area and perimeter.
I apologize that I keep coming back with more questions. I can create seperate questions from now on, if that is better. Is there a way I can club the code above with the one that you wrote, so that I can get everything with a single code.
Star Strider
2021년 4월 5일
I do not understand what that code is supposed to do.
Also, what are the data in ‘planeat11mm.xlsx’? There are 4 columns, ‘x’, ‘z’, ‘a’, and ‘b’. What should be done with them?
Shri Harsha Bharadwaj
2021년 4월 5일
justplastic0.5.xlsx, has just one set of data. So, I would like to compute the perimeter of just one blob.
But in the case of planeat11mm.xlsx, there are two sets of data. I would like to compute the perimeter of both the inner shape and the outer shape.
Shri Harsha Bharadwaj
2021년 4월 5일
편집: Shri Harsha Bharadwaj
2021년 4월 5일
Also @Star Strider, I came across something called alpha value, maybe I should be using that. Any suggestions are welcome. Thanks.
Star Strider
2021년 4월 6일
편집: Star Strider
2021년 4월 6일
It turns out that I made a stupid mistake in my code, and multiplied instead of addied.
That is now corrected, and this works, giving reasonable results:
T1 = readtable('justplastic0.5.xlsx');
T2 = readtable('planeat11mm.xlsx');
pwr10 = @(x) [x/10^fix(log10(x)-1) fix(log10(x)-1)];
x1 = T1.z;
y1 = T1.x;
dx1 = gradient(x1);
dy1 = gradient(y1);
C1 = trapz(sqrt(dx1.^2 + dy1.^2));
figure
plot(x1, y1)
grid
axis('equal')
text(mean(T1.z), mean(T1.x), sprintf('$C = %.3f\\times 10^{%d}$', pwr10(C1)), 'Horiz','center','Vert','middle', 'Interpreter','latex')
x2 = T2.z(~isnan(T2.z));
y2 = T2.x(~isnan(T2.x));
dx2 = gradient(x2);
dy2 = gradient(y2);
C2 = trapz(sqrt(dx2.^2 + dy2.^2));
figure
plot(T2.z,T2.x)
grid
axis('equal')
text(mean(x2), mean(y2), sprintf('$C = %.3f\\times 10^{%d}$', pwr10(C2)), 'Horiz','center','Vert','middle', 'Interpreter','latex')
x3 = T2.a;
y3 = T2.b;
dx3 = gradient(x3);
dy3 = gradient(y3);
C3 = trapz(sqrt(dx3.^2 + dy3.^2));
figure
plot(x3, y3)
grid
axis('equal')
text(mean(T2.a), mean(T2.b), sprintf('$C = %.3f\\times 10^{%d}$', pwr10(C3)), 'Horiz','center','Vert','middle', 'Interpreter','latex')
The circumference prints out in the centre of each figure in the plot. (The ‘pwr10’ function just creates an interesting string for the plots. It may not be robust, and is not required for the code.)
Since the first data set is a roughly circular plot, I checked that calculation with:
x11 = T1.z;
y11 = T1.x;
x11 = x11 - mean(x11);
y11 = y11 - mean(y11);
f = @(r) ((x11).^2 + (y11).^2 - r^2);
r = fsolve(f, 1E-4);
C11 = 2*pi*r;
That gives essentially the same result as ‘C1’.
I almost cannot imagine that I spent several hours on this and in all that time completely failed to notice that I multiplied instead of added in the trapz calls. With that correction , it works!
Shri Harsha Bharadwaj
2021년 4월 6일
편집: Shri Harsha Bharadwaj
2021년 4월 6일
@Star Strider Thanks for the help and clarification sir. I really appreciate it. Please let me know either way.
Shri Harsha Bharadwaj
2021년 4월 6일
@Star Strider This is perfect. Works like a charm. Thanks for spending much time of your day to help me out. Have a great day sir.
Star Strider
2021년 4월 6일
As always, my pleasure!
The time I spent was my fault! It actually should only have required a few minutes.
Shri Harsha Bharadwaj
2021년 4월 27일
편집: Shri Harsha Bharadwaj
2021년 4월 27일
Hope you are doing well sir. I had one last question that I wanted to run by you.
Given an irregular figure, it is possible to calculate the centerline distance from the leading end to the trailing end.
The red line illustrates the centerline length that I want to compute. I made the centerline in word. Is there a way we can generate a centerline like this automatically in MATLAB and calculate the length of the centerline?. Even an approximation would be good, especially in the curvature part.
I have also attached the excel file for your reference.
Thanks for the help.
Star Strider
2021년 4월 27일
I worked on that for a couple hours. I have absolutely no idea how to draw that centrelline, and I cannot find any functions that would do it.
Sorry.
Shri Harsha Bharadwaj
2021년 4월 27일
편집: Shri Harsha Bharadwaj
2021년 4월 27일
@Star Strider No problem sir. Thanks for the help. Have a great day.
Shri Harsha Bharadwaj
2021년 5월 13일
편집: Shri Harsha Bharadwaj
2021년 5월 13일
Hope you are doing well. This might be a very simple question for you.
I am trying to 3D plot something like this.
Given I have the data, how would I plot this?. Most of the codes that I looked up for 3D plotting uses some sort of an equation in one of the variables.
https://www.mathworks.com/help/matlab/visualize/creating-3-d-plots.html - Should I be using the surf function?
EDIT:
I looked into your older answers - https://www.mathworks.com/matlabcentral/answers/829218-3d-plot-from-excel#answer_699128?s_tid=prof_contriblnk
But not the same.
Star Strider
2021년 5월 13일
I wish it was simple! I have no idea how to plot them because I have no idea what the variables are.
My best effort —
C1 = readcell('https://www.mathworks.com/matlabcentral/answers/uploaded_files/617108/test1.csv');
T1 = readtable('https://www.mathworks.com/matlabcentral/answers/uploaded_files/617108/test1.csv', 'VariableNamingRule','preserve');
First10Rows = T1(1:10,:)
First10Rows = 10×7 table
Chart Count Velocity [ m s^-1 ] Z Var4 Chart Count_1 Velocity [ m s^-1 ]_1 Z_1
___________ ___________________ _____ ____ _____________ _____________________ _____
0 0 0.008 NaN 0 0.000377 0.006
1 0.00156 0.008 NaN 1 0.000678 0.006
2 0.00313 0.008 NaN 2 0.000979 0.006
3 0.00469 0.008 NaN 3 0.00128 0.006
4 0.00626 0.008 NaN 4 0.00158 0.006
5 0.00782 0.008 NaN 5 0.00188 0.006
6 0.00939 0.008 NaN 6 0.00218 0.006
7 0.011 0.008 NaN 7 0.00248 0.006
8 0.0125 0.008 NaN 8 0.00279 0.006
9 0.0141 0.008 NaN 9 0.00309 0.006
figure
plot3(T1{:,3},T1{:,5},T1{:,2})
hold on
plot3(T1{:,3},T1{:,5},T1{:,6})
hold off
grid on
The arguments to the plot3 call refer to the columns of ‘T1’, so ‘T1{:,1}’ is the first column, and so for the others.
I added the readcell call because readtable read in one of the variables as NaN and I wanted to see what that was. It turns out to apparently be a vector of empty cells.
Shri Harsha Bharadwaj
2021년 5월 13일
편집: Shri Harsha Bharadwaj
2021년 5월 13일
@Star Strider Thanks for the help sir. I just had one question. The Z axis values are different. Could ou please tell as as to why they are being plotted at the same location?
EDIT:
Also ,when I have varying Y as well, all the Y points seem to originate from the same location. When I plot the graph in excel, I have something like this.
But when I do the same in MATLAB. both the Y and Z values do not vary. I am not sure if how I said this makes much sense. The bounds on the blue line is between [-1,1]* 10^-3, whereas the bounds of the orange line is different. But when plotted in MATLAB, they both have the same bounds of [-1,1]*10^-3.
Star Strider
2021년 5월 13일
As always, my pleasure!
They are plotted in the same location because I have no idea what the variables are, or how you would like them plotted. The ‘Velocity’ variables are obviously the dependent variables, however I have no idea what the independent variables should be. (The plot3 function requires two independent variables and one dependent variable.)
Perhaps —
T1 = readtable('https://www.mathworks.com/matlabcentral/answers/uploaded_files/617108/test1.csv', 'VariableNamingRule','preserve');
First10Rows = T1(1:10,:)
First10Rows = 10×7 table
Chart Count Velocity [ m s^-1 ] Z Var4 Chart Count_1 Velocity [ m s^-1 ]_1 Z_1
___________ ___________________ _____ ____ _____________ _____________________ _____
0 0 0.008 NaN 0 0.000377 0.006
1 0.00156 0.008 NaN 1 0.000678 0.006
2 0.00313 0.008 NaN 2 0.000979 0.006
3 0.00469 0.008 NaN 3 0.00128 0.006
4 0.00626 0.008 NaN 4 0.00158 0.006
5 0.00782 0.008 NaN 5 0.00188 0.006
6 0.00939 0.008 NaN 6 0.00218 0.006
7 0.011 0.008 NaN 7 0.00248 0.006
8 0.0125 0.008 NaN 8 0.00279 0.006
9 0.0141 0.008 NaN 9 0.00309 0.006
figure
plot3(T1{:,1},T1{:,3},T1{:,2})
hold on
plot3(T1{:,5},T1{:,7},T1{:,6})
hold off
grid on
would work instead.
Shri Harsha Bharadwaj
2021년 5월 13일
Thanks for the help sir. I was testing it out. Thanks a ton again.
Star Strider
2021년 5월 14일
As always, my pleasure!
Apparently the data file changed (I have been away doing other things), since it is not the same one I initially plotted.
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Line Plots에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!오류 발생
페이지가 변경되었기 때문에 동작을 완료할 수 없습니다. 업데이트된 상태를 보려면 페이지를 다시 불러오십시오.
웹사이트 선택
번역된 콘텐츠를 보고 지역별 이벤트와 혜택을 살펴보려면 웹사이트를 선택하십시오. 현재 계신 지역에 따라 다음 웹사이트를 권장합니다:
또한 다음 목록에서 웹사이트를 선택하실 수도 있습니다.
사이트 성능 최적화 방법
최고의 사이트 성능을 위해 중국 사이트(중국어 또는 영어)를 선택하십시오. 현재 계신 지역에서는 다른 국가의 MathWorks 사이트 방문이 최적화되지 않았습니다.
미주
- América Latina (Español)
- Canada (English)
- United States (English)
유럽
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
아시아 태평양
- Australia (English)
- India (English)
- New Zealand (English)
- 中国
- 日本Japanese (日本語)
- 한국Korean (한국어)