MATLAB Answers

0

How to avoid white patch in contourf ?

Asked by DIPANJAN DEY on 23 Mar 2018
Latest activity Commented on by Kelly Kearney
on 26 Mar 2018
I am facing a problem from quite a long time. My data range is beyond my colorbar limit. That is why when the minimum value exceeded the colorbar limit it is coming white but it is okay for maximum value. How to solve this? In python something like extend = both works but what about MATLAB?
PS: I don't want to extend my colorbar limit.

  8 Comments

Can you please tell me why in the upper limit it is not happening? Also yes I want to see the original values as I can see now for the dark red regions (above 1.9).
You say "when the minimum value exceeded the colorbar limit it is coming white" however, the minimum value (according to the colors) seems to be -1.9. However not all values that exceed your minimum value are white. I see values showing up as red and blue also. In fact, it seems like the only values showing up as white are around the range -0.1 to +0.1.
Anyway, let's assume you want that range to be some color other than white. You can just set the middle of the colormap to that color. What color do you want it to be?
The middle portion of my colorbar is white due to my colormap. But the white portion in the middle of the figure is not due to the colormap and the values there are lower than -1.9. If you use a different colormap then also you can see this white region.

Sign in to comment.

Tags

1 Answer

Answer by Kelly Kearney
on 23 Mar 2018

Matlab's contourf function doesn't actually plot contour faces for lower-than-lowest-clevel regions when are unenclosed. (And for that matter, what it does with enclosed lower-than-lowest-clevel regions varies between Matlab versions).
I think my contourfcmap function with the calccontour option should be able to create the plot the way you'd like it.
Alternatively, you can set your axis color to match the lowest value in your colormap... that way empty contour regions will appear the correct color.

  4 Comments

Show 1 older comment
The NaNs wreak a bit of havoc in my function (I've tried to come up with ways to deal with them... but things it's not always successful). In your case, things work smoothly if you remove the NaNs first (which doesn't really affect the contours, given that your NaNs just bracket the data):
Tmp = load('contourf_prob.mat');
[x,y] = meshgrid(Tmp.lat_a, Tmp.lev);
isn = all(isnan(Tmp.psi),1);
ax(1) = subplot(2,1,1);
contourf(Tmp.lat_a(~isn), Tmp.lev, Tmp.psi(:,~isn), Tmp.zlevs);
set(ax(1), 'clim', Tmp.zlevs([1 end]));
hold on;
scatter(x(:), y(:), 10, Tmp.psi(:), 'filled');
colormap(ccode(19));
colorbar('eastoutside');
title('Matlab''s contourf');
ax(2) = subplot(2,1,2);
contourfcmap(Tmp.lat_a(~isn), Tmp.lev, Tmp.psi(:,~isn), Tmp.zlevs, ...
ccode(19),'lo',[0 0 0.540],'hi',[0.540 0 0], ...
'cbarloc','eastoutside','method','calccontour');
% contourf(Tmp.lat_a, Tmp.lev, Tmp.psi, Tmp.zlevs);
title('My contourfcmap');
hold on;
hs = scatter(x(:), y(:), 10, Tmp.psi(:), 'filled');
set(gca, 'clim', minmax(Tmp.zlevs));
colormap(ccode(19));
set(ax, 'ydir', 'reverse');
(Edited to add scatter plot that demonstrates that yes, contourf is misrepresenting the below-lowest region).
Thanks for your help. Yes this is the plot I want it but now the x_axis reduces as we omitted the nans, also if we increase the x-axis there is straight line coming at the end. Which is in my case not acceptable. Another thing, now i am unable to move the colorbar to my desired location (other than specified). Data cursor also not showing the value, i cannot specify my line style
I'm working on a fix to the NaN issue... may take a day or two. The colorbar enhancement is one that's been on my to-do list for a while... I'll see if I have time for that one as well, but no promises.
You can specify the line style by saving the handles structure (first output of contourfcmap) and then applying any changes you'd like.
Not sure about the data cursor thing... I don't use that myself. If it relies on interacting with a contourgroup object, then that's not really something I can offer, since my function uses simple patches and lines.

Sign in to comment.