How to Fit Points on a Previous Plot
4 views (last 30 days)
Show older comments
I have a 401x2 double that plots the bythmetry of a beach.
I have 9 depth positions of sensors on the bottom with data provided in a 1x9 double.
I want to plot the sensors on the bythmetry plot. The depth of sensors don't directly match up with the value of depths given in the 401x2 double.
%(pro=bythymetry 401x2) (zp=depth of sensors 9x1)
plot(pro(:,1),pro(:,2)) %(distance,depth) ,depth decreases as you go below sea level (-#)
for i = length(zp)
for j = length(pro(:,2))
if pro(j,2) > zp(i) && pro(j+1,2) < zp(i) %find estimated distance where the depth occurs
hold on
plot(pro(j,1),zp(i))
end
end
end
I could use some help. Anyway I try to write a nested for loop with a conditional statement, I don't get any values! Advice on interpolating and plotting would be helpful
plot(pro(:,1),pro(:,2))
this gives

EDIT: I ATTACHED THE DATA AND A FILE TO HELP YOU UNDERSTAND THE DATA (Try it for yourselves might be fun - theres a sand bar)
2 Comments
Accepted Answer
dpb
on 2 Feb 2021
Edited: dpb
on 3 Feb 2021
If I understand what you're after from the code that doesn't quite work--
plot(pro(:,1),pro(:,2))
hold on
iz=arrayfun(@(z)find(z>=pro(:,2),1),zp);
plot(pro(iz,1),zp,'r*-')
legend('Full data set','Nearest @ ZP')
yields

ADDENDUM:
Another "trick" for such problems is to use interp1 backwards -- that is, use the ordinal position of the elements in the array as th y output instead of the more usual "t'other way 'round"
>> interp1(pro(:,2),1:size(pro,1),zp,'nearest')
Error using griddedInterpolant
The grid vectors must contain unique points.
Error in interp1 (line 151)
F = griddedInterpolant(X,V,method);
>>
This isn't an uncommon event with data; interp1 requires that the interpolant be unique; can handle in various ways; either add just a little random noise that is small in size compared to the data to "fuzzy it up" or just pick the unique ones. We'll use the latter method here--
[~,ia]=unique(pro(:,2));
iz=interp1(pro(ia,2),1:size(ia),zp,'nearest')+(size(pro,1)-numel(ia));
hL=plot(pro(iz,1),zp,'g*');
xlim([120 250])
will show almost the identical locations; one off in a couple places where the nearest zp value is the second in the range instead of the first.
0 Comments
More Answers (1)
dpb
on 2 Feb 2021
Edited: dpb
on 2 Feb 2021
I'm betting you're forgeting your above note that increasing depths are larger negative numbers and have something like the following for a given iteration...indices removed for ease in reading--
pro=[-90 -110]; % a set of depths in the profile table
zp=-100; % a sampled data point; should be between given depths
Your code as written is--
>> pro(2)>zp & pro(1)<zp
ans =
logical
0
>>
which fails. What's going on?
Substituting values the above expression is
pro(2)> zp & pro(1)< zp
(-110 >-100) & (-90 < -100)
ans =
logical
0
You're forgetting that the order is increasing going down in depth but up in the indices of the stored array locations in the 2-vector in profile.
Either swap pro(2) and pro(1) or change the direction of the tests in the above expression or wrap each element in the expression inside abs()
Also NB: you want the "&" operator here, not "&&"
2 Comments
dpb
on 2 Feb 2021
I think you're still not thinking correctly about the sign sense of comparisons with negative numbers... :)
See Also
Categories
Find more on Logical in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!