MATLAB: Bug in pcolor

pcolor

Hi,
Whenever I use pcolor for a checkerboard plot the lines of my x-axis and y-axis disappear. This problem can be reproduced even with the example in the matlab help!
Try this (looks OK):
figure;
pcolor(hadamard(20))
colormap(gray(2))
shading flat;
axis ij
axis square
and compare against this (x,y axis disappears):
figure;
pcolor(hadamard(20))
colormap(gray(2))
shading flat;
axis ij
For whatever reason using pcolor together with shading flat makes the axis disappear (only the axis on the bottom and left of the plot). Why is that and why does using the axis square command make a difference?
In principle the axis square command would fix the problem but I don't want my axes to be square. Using axis normal instead does NOT fix the problem…
Any ideas?

Best Answer

It is not a problem of pcolor, but a bug in the OpenGL renderer. It appears in the standard 2D-view and with enabled stretch-to-fill behaviour (DataAspectRatioMode, PlotBoxAspectRatioMode, CameraViewAngleMode set to 'auto'): Rounding errors influence the clipping and lines of the box disappear for some combinations of axes size in pixels and limits of the axes. In addition the X-ticks appears at bad positions.
Workaround: Rotate the axes object by a tiny angle, which move the objects by less than a pixel:
% Display the problem:
figure('Renderer', 'OpenGL', 'Position', [360, 502, 560, 420]);
AxesH = axes;
pcolor(hadamard(20))
colormap(gray(2))
shading('flat');
pause(1);
% Fix the problem:
set(AxesH, 'CameraUpVector', ...
[-sin(0.0001), cos(0.0001), 0] .* get(AxesH, 'DataAspectRatio'));
Using the ZBuffer or Painters renderer is a simple and nice workaround, if you do not need transparency in the plot.
Changing the YLimits by some eps value works sometimes, but I have not been able to identify the underlying pattern. The consideration of the DataAspectRatio is important, because:
set(AxesH, 'CameraUpVector', [-sin(0.0001), cos(0.0001), 0]) % BAD!
can have very strange effects to the positions of the X- and Y-labels.
This bug existed in Matlab 6.5 already, so you are in touch with a very solid history.