A mysterious problem regarding NaNs, imagesc and subplots.

Hi,
I am working on a project where I need to plot an error rate as a function of two parameters as both surface and imagesc. Since I do not have results for all combinations of the parameters, my matrix of error rates contains quite a few NaNs. I need to distinguish the NaNs from the zeros, and found a neat method at the end of this thread for omitting them from the imagesc plot:
h=imagesc(A);
set(h,'alphadata',~isnan(A))
This worked like a charm at first, but then I needed to change the axis on the surface plot (which is in a separate subplot in the same figure) to a log scale, and suddenly the NaNs in the imagesc plot pop back up. See for yourself:
% Initialize error matrix A with random values, and some NaNs.
A = rand(10,10);
A(A<1/3) = NaN;
% Here the NaNs show up as white
figure
subplot(1,2,1);
surf(A)
subplot(1,2,2);
h=imagesc(A);
set(h,'alphadata',~isnan(A))
% Here they don't
figure
subplot(1,2,1);
surf(A)
set(gca,'XScale','log');
subplot(1,2,2);
% set(gca,'XScale','linear'); % I tried this to no avail.
h=imagesc(A);
set(h,'alphadata',~isnan(A))
I have no idea why this happens! Why would the axis scale on one subplot influence the other?
Is this a bug in Matlab, or am I doing something wrong here?
Any input would be much appreciated.

 채택된 답변

Doug Hull
Doug Hull 2011년 6월 13일

2 개 추천

There are three renderers in MATLAB. The only one that handles transparency is OPENGL. Unfortunately, OPENGL does not handle log scale.

댓글 수: 3

Thanks, Doug! That takes some of the mystery away :)
I still do not quite understand why having a log scale on one subplot should affect another subplot, though...
There is only one renderer per _figure_.
Ah. I see then. Thanks.

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Richard
Richard 2011년 6월 14일
A workaround is to use a surface with flat shading (the default) and just view it from above. You do have to do a bit of extra work to get a similar output as imagesc gives you.
% Initialize error matrix A with random values, and some NaNs.
A = rand(10,10);
A(A<1/3) = NaN;
% Here the NaNs show up as white
figure
subplot(1,2,1);
surf(A)
subplot(1,2,2);
surf(0.5:(size(A, 2)+0.5), 0.5:(size(A, 1)+0.5), ...
zeros(size(A)+1), A, 'edgecolor', 'none');
axis('tight');
view(2);
grid('off');
box('on');
set(gca, 'YDir', 'reverse');
Jordan Mertes
Jordan Mertes 2011년 6월 22일

0 개 추천

I'm having a similar problem. I turn my NaN to transparent but when I do this the left and bottom axis box disappear. I can't figure out how to get them back. I have tried with the other renderers but one of them makes the NaNs blue again and the other doesn't do anything. Any thoughts on this?
Thanks

카테고리

제품

질문:

2011년 6월 13일

Community Treasure Hunt

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

Start Hunting!

Translated by