2-node-supercomputer.net 2021-06-11

none vs nearest in Matplotlib’s imshow()

To get a visual display of the entries of a matrix, I often use Matplotlib’s imshow() function. However, by default that function does bilinear interpolation in order to smooth the values between the centers of the pixels. That makes it virtually useless for analysing the elements of a matrix.

Therefore, I have been passing to imshow() the parameter interpolation='none'. This led to a mysterious bug, where I would save the image in PDF format, then include in a LaTeX document and compile directly to PDF using latexmk -pdf myfile.tex. The bug would manifest itself when displaying the PDF at some lower resolutions it would blur the image and do some kind of interpolation or antialiasing between the pixel centers again. But not at all lower resolutions, which is why it had escaped me before.

Clearly, this can be done better? Yes!

Pass interpolation='nearest' instead. That solves the bug, at least as well as I can expect. Why does this work? No idea. I guess it somehow turns off that antialiasing. In any case, remember to use 'nearest' instead of 'none'.