MATLAB Answers

Surf with shading interp, not interpolating sometimes.

160 views (last 30 days)
modelhelp
modelhelp on 30 Aug 2017
Answered: Kris Fedorenko on 6 Sep 2017
So I am trying to plot waveform data both as lines (using plot3) and also as a smoothed color connecting the waveform using surf and shading interp (see picture). In the image it looks correct between ~135 and 215 on the x-axis and between ~230 and 245, but I don't understand the gap between ~215 and 230, and after 245.
Basically the question is why is it interpolating between 135-215 but not between 213-230?
Here is the plotting section of my script. The sizes of all the plotting variables is 1200 x 578. They are mostly columns of nan becasue prior to plotting I filter out unwanted columns and replace them with nan.
To recreate this, load the .mat file and run this code:
loat 'ex.mat'
figure(1)
hold on
plot3(baz_amps, times,repmat(2,1200,578),'k','Linewidth', .1)
caxis([-.25 .25])
colormap(redblue)
surf(baz_list,times,Amps)
shading interp
view(2)
colorbar
ylim([0 35])
xlim([min(min(baz_list))-5 max(max(baz_list))+5])
Hopefully that works. Side note, I am using R2014a.
Thanks for any help

  0 Comments

Sign in to comment.

Answers (1)

Kris Fedorenko
Kris Fedorenko on 6 Sep 2017
Hi!
I believe the issue is with the NaN values. The shading interp command only dictates how the colors are shown for the existing datapoints, but does not fill in NaN values. In fact, any NaN values are explicitly not plotted. I see that your data has only 14 columns of non-NaN values, so I think what you want is to get rid of the NaN columns altogether. For example:
load 'ex.mat'
nRows = size(Amps, 1);
nan_cols = sum(isnan(Amps)) == nRows;
Amps(:, nan_cols) = [];
nan_cols = sum(isnan(baz_amps)) == nRows;
baz_amps(:, nan_cols) = [];
nan_cols = sum(isnan(times)) == nRows;
times(:, nan_cols) = [];
nan_cols = sum(isnan(baz_list)) == nRows;
baz_list(:, nan_cols) = [];
nCols = size(Amps, 2);
figure;
hold on
plot3(baz_amps, times,repmat(2,nRows, nCols),'k','Linewidth', .1)
caxis([-.25 .25])
colormap(cool)
surf(baz_list,times,Amps)
shading interp
view(2)
colorbar
ylim([0 35])
xlim([min(min(baz_list))-5 max(max(baz_list))+5])
xlabel('baz amps')
ylabel('times')
zlabel('Amps')
This code should produce a plot like this one:
Hope this helps!
Kris

  0 Comments

Sign in to comment.

Sign in to answer this question.