Find minimum values based on unique number

I have a dataset of temperatures collected over multiple depth profiles (1-147 profiles). The data is all listed in one long table, not by each profile (attached).
Each profile has a different temperature minimum, and I want to find this minimum for each profile, and colour all of the temperatures above this in grey in a figure (essentially discarding them).
  1. Evidently I'm going about this the wrong way as my output (T_min) is all the same number (see code below).
  2. Once I have the T_min for each profile, when I do a scatter plot, how can I colour each dot less than the T_min - for that particular profile - grey?
Thanks in advance - sorry if this isn't very clear.
j=1;
for i=1:length(dives)
T_min(j) = nanmin(SG579_FINAL_table_MF.Cons_temp(dives));
j=j+1;
end

 Accepted Answer

hello
the provided mat file contains 492 different profiles (and not 147)
my suggestion so far :
load('matlab.mat')
prof = Prof_temp.Profile_num;
prof_unic = unique(prof);
for k=1:length(prof_unic)
ind = (prof == prof_unic(k));
T_min(k) = min(Prof_temp.Temp(ind),[],'omitnan');
end
plot(prof_unic,T_min);
xlabel('Profile #')
ylabel('Average temperature')

10 Comments

Apologies, I tweaked the data before I shared it and forgot to update my text.
Thank you so much, your code has highlights the minimum values in each profile, exactly as I wanted!
I was now hoping to plot a scatter plot of the data against another variable (called S), but colour the points where the points less than the T min for that profile are coloured differently.
and can you provide this S data ?
Of course, and as you may have seen below I have misexplained what I actually want to do.
This is my aim:
T_min for each profile will be located at a certain depth (called Pres, and the T_min Pres will differ between profiles). In the scatter plot of T and S, I wanted to colour any dots shallower than the T_min Pres (differing between profiles) grey.
if I have understood correctly maybe then this is it :
load('matlab.mat')
load('Pres.mat')
load('S.mat')
prof = Prof_temp.Profile_num;
prof_unic = unique(prof);
indgrey = [];
for k=1:length(prof_unic)
ind = (prof == prof_unic(k));
[T_min(k),indm] = min(Prof_temp.Temp(ind),[],'omitnan');
Pres_of_Tmin(k) = Pres(indm);
% indices of data to put in grey
indgrey = [indgrey; find(Pres(ind)<Pres_of_Tmin(k))]; % find for each profile the data for which Pres is lower than Pres_of_Tmin
% and concatenate those indexes
end
indnongrey = (1:numel(prof));
indnongrey(indgrey) = [];
scatter(S(indnongrey),Pres(indnongrey),5); % "non grey" elements
hold on
grayColor = [.7 .7 .7];
scatter(S(indgrey),Pres(indgrey),5,grayColor); % "grey" elements
hold off
xlabel('S')
ylabel('Temp')
Thanks so much, this code works with my data, but looks like it is maybe only applying to one profile at a time rather than finding the depth minimum T for every profile and greying out all data shallower than that?
Apologies if it isn't doing that - I just would have expected more points to be grey
the code - hopefully - should do what i put in the comment (and what I understood from your query but maybe I'm wrong)
% find for each profile the data for which Pres is lower than Pres_of_Tmin
% and concatenate those indexes
I don't think its far off, but I would expect most data at a pressure less than somewhere between 50 - 200 m to be grey. But I don't want to take up any more of your time, I'm sure I can fiddle with what you've done for me so far, it's a huge help - thank you!
I have now a slight doubt when you say : one profile at a time rather than finding the depth minimum T for every profile and greying out all data shallower than that?
does "all data" mean data of each profile or all together ?
my code above was supposing greying within each profile
if it's the second option, the new code would be - hopefully again without error :
load('matlab.mat')
load('Pres.mat')
load('S.mat')
prof = Prof_temp.Profile_num;
prof_unic = unique(prof);
indgrey = [];
for k=1:length(prof_unic)
ind = (prof == prof_unic(k));
[T_min(k),indm] = min(Prof_temp.Temp(ind),[],'omitnan');
Pres_of_Tmin(k) = Pres(indm);
% indices of data to put in grey
indgrey = [indgrey; find(Pres<Pres_of_Tmin(k))]; % find the entire data which Pres is lower than Pres_of_Tmin
% and concatenate those indexes
end
indgrey = unique(indgrey);
indnongrey = (1:numel(prof));
indnongrey(indgrey) = [];
scatter(S(indnongrey),Pres(indnongrey),5); % "non grey" elements
hold on
grayColor = [.7 .7 .7];
scatter(S(indgrey),Pres(indgrey),5,grayColor); % "grey" elements
hold off
xlabel('S')
ylabel('Temp')
Thank you! This looks more like what I was expecting. Apologies for my lack of clarity :)
ok - glad we finally converged to the solution !! :)

Sign in to comment.

More Answers (1)

P = load('matlab.mat').Prof_temp
P = 460116x2 table
Profile_num Temp ___________ _______ 1 0.73595 1 0.73338 2 0.73372 2 0.72239 2 0.73413 2 0.7322 2 0.73786 2 0.73755 2 0.73594 2 0.74415 2 0.7336 2 0.72792 2 0.74704 2 0.75886 2 0.75926 2 0.7642
S = groupsummary(P,"Profile_num","min","Temp")
S = 492x3 table
Profile_num GroupCount min_Temp ___________ __________ __________ 1 2 0.73338 2 144 0.65173 3 2 0.73312 4 144 0.69801 5 239 0.36951 6 78 0.35654 7 79 0.70014 8 160 0.66216 9 156 0.013414 10 205 0.013662 11 442 0.00084435 12 626 0.028878 13 705 0.025135 14 959 0.015209 15 683 0.026312 16 915 -0.058026
plot(S.Profile_num,S.min_Temp)

4 Comments

Thank you so much!
I was now hoping to plot a scatter plot of the data against another variable (called S), but colour the points where the points less than the T min for that associated profile number are coloured differently. (Sorry, I know this is confusing wording).
" colour the points where the points less than the T min for that associated profile number are coloured differently."
I guess you mean where the S-values are less thatn T-min (because of course no Temp values should be less than T-min.
P = load('matlab.mat').Prof_temp
P = 460116x2 table
Profile_num Temp ___________ _______ 1 0.73595 1 0.73338 2 0.73372 2 0.72239 2 0.73413 2 0.7322 2 0.73786 2 0.73755 2 0.73594 2 0.74415 2 0.7336 2 0.72792 2 0.74704 2 0.75886 2 0.75926 2 0.7642
S = randn(size(P.Temp))
S = 460116x1
-1.9744 -0.7961 -0.0034 -0.2607 -0.4320 -1.1208 0.1508 0.5829 0.5262 -1.6224
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
V = grouptransform(P.Temp,P.Profile_num,@min);
X = S<V;
scatter(S(X),P.Temp(X),23,[1,1,1]./2)
hold on
scatter(S(~X),P.Temp(~X),23)
xlabel('S')
ylabel('Temp')
Sorry you make an excellent point and have made me realise I've completely messed up my explanation.
T_min for each profile will be located at a certain depth (called Pres, and the T_min Pres will differ between profiles). In the scatter plot of T and S, I wanted to colour any dots shallower than the T_min Pres (differing between profiles) grey.
Here are the data for Pres and S

Sign in to comment.

Categories

Find more on Graphics Performance in Help Center and File Exchange

Products

Release

R2022a

Asked:

on 15 May 2024

Commented:

on 15 May 2024

Community Treasure Hunt

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

Start Hunting!