Help with ocean transect plot

29 次查看(过去 30 天)
Hi Matlabbers,
I'm fairly new to the community and struggling to make a transect plot of some nitrate data that I have from CTD casts. I have 11 stations across an area, each with different depths, and each with various nitrate concentration data.
So, what I want to produce is a transect plot, showing water depth on the y axis, distance between stations on x-axis and the nitrate concentration at each station on the z-axis, but in a 2D plot.
My issue is, for each station, the depth varies, and my nitrate concentration data is quite scattered, hence I want to interpolate it so that for missing data (NaNs), it takes the concentration from neighbouring stations at the same depth and generates a value. When I do this using my data, Matlab interpolates across the rows which doesnt work since there are various depths across each row. I can't really make a uniform depth profile because it differs so much between each station. I've tried fillmissing and interp1 to get around the fact that i have so many NaN values, but the results are really blocky.
Any suggestions?
This is what I currently get:
And this is the sort of look I'm after
Thanks in advance :)

采纳的回答

Ruchika Parag
Ruchika Parag 2024-6-26
Hi Lisa,
Here are some suggestions to help you achieve your goal:
  1. Interpolate Data in 2D: Use griddata or scatteredInterpolant to interpolate your data in both depth and distance dimensions. This will help in filling NaN values more effectively.
  2. Create a Regular Grid: Generate a regular grid for both depth and distance to interpolate your scattered data onto this grid.
  3. Plotting: Use pcolor or contourf to plot the interpolated data.
Here is a code snippet explaining how you can do this:
% Define stations used
stn_use_SC = [5 8 9 14 15 16 19 20 21 22 23];
stn_name_SC = {'SC2' 'SC3' 'SC4' 'SC5' 'SC6' 'SC7' 'SC8' 'SC9' 'SC10' 'SC11' 'SC12'};
% Cumulative distance between each station
cumdistS = [0 2.6087 3.5718 4.7268 5.3693 5.9175 6.5523 7.1430 7.3480 7.8354 7.9372];
% Extract relevant data
depths = Depth(:, stn_use_SC);
nitrate = Nitrate(:, stn_use_SC);
% Flatten the data to create vectors for griddata
depths_vector = depths(:);
cumdistS_vector = repmat(cumdistS, size(depths, 1), 1);
cumdistS_vector = cumdistS_vector(:);
nitrate_vector = nitrate(:);
% Remove NaN values from the vectors
valid_indices = ~isnan(nitrate_vector);
depths_vector = depths_vector(valid_indices);
cumdistS_vector = cumdistS_vector(valid_indices);
nitrate_vector = nitrate_vector(valid_indices);
% Create a regular grid for interpolation
depth_grid = linspace(min(depths_vector), max(depths_vector), 100);
distance_grid = linspace(min(cumdistS_vector), max(cumdistS_vector), 100);
[distance_mesh, depth_mesh] = meshgrid(distance_grid, depth_grid);
% Interpolate nitrate data onto the regular grid
nitrate_interpolated = griddata(cumdistS_vector, depths_vector, nitrate_vector, distance_mesh, depth_mesh, 'linear');
% Plot the interpolated data
figure;
pcolor(distance_mesh, depth_mesh, nitrate_interpolated);
shading interp;
colorbar;
colormap('parula');
hold on;
% Plot the original data points
plot(cumdistS, depths, 'k.', 'MarkerSize', 10);
% Add contour lines
contour(distance_mesh, depth_mesh, nitrate_interpolated, 'k', 'ShowText', 'on');
% Adjust the position of station names to be above the plot area
y_label_position = -max(depth_grid) * 0.05; % Adjust this value as needed
for i = 1:length(stn_name_SC)
text(cumdistS(i), y_label_position, stn_name_SC{i}, 'fontsize', 5, 'rotation', 45, 'HorizontalAlignment', 'right');
end
% Label axes
xlabel('Distance (km)');
ylabel('Depth (m)');
% Reverse both axes
set(gca, 'XDir', 'reverse', 'YDir', 'reverse', 'fontsize', 12);
% Adjust y-axis limits
ylim([0 400]);

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Interpolation 的更多信息

产品


版本

R2022a

Community Treasure Hunt

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

Start Hunting!

Translated by