odd behavior with 'nearest' interpolation

Hi! I am using matplotlib v 1.4.3 with Python 2.7.10 :: Anaconda 2.4.0 (64-bit).

What I am doing here is creating a 7x7 pixel image from a 7x7 matrix. I expect to see one pixel per data point, but that's not what I'm seeing. Instead of a diagonal make up of single pixels, I get an odd 2x2 pixel blob in the middle of the correct one pixel diagonal.

···

---------------------------------------------------------------------------
import numpy as np
import matplotlib.pylab as plt

if __name__ == "__main__":
    n = 7
    data = np.identity(n, float)

    # Create an nxn size figure with no frame
    fig = plt.figure(figsize=(n, n), frameon=False)

    # make the axes to the edge of the figure
    ax = plt.Axes(fig, [0.0, 0.0, 1.0, 1.0])
    # turn the axes off
    ax.set_axis_off()
    # add the axes to this figure
    fig.add_axes(ax)
    # show the data. Don't do any interpolation.
    ax.imshow(data, interpolation='nearest', origin='lower',aspect='auto')
    # Save the figure at 1 dot per inch, which should mean 1 data point per
    # pixel
    fig.savefig("image.png", dpi=1)

---------------------------------------------------------------------------

Since I'm not sure that if I can attach the png image I get, here is a ppm version of the image I get (between the ------). Save this image.ppm minus the dashes and you should be able to open it in something like gimp.

---------------------------------------------------------------------------
P3
# CREATOR: GIMP PNM Filter Version 1.1
7 7
255
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
---------------------------------------------------------------------------

Thanks.
Christine
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/matplotlib-users/attachments/20151117/9da59709/attachment.html>

This seems to be working ok for me:

···

On Tue, Nov 17, 2015 at 4:22 PM, Smit, Christine E. (GSFC-610.2)[TELOPHASE CORP] <christine.e.smit at nasa.gov> wrote:

Hi! I am using matplotlib v 1.4.3 with Python 2.7.10 :: Anaconda 2.4.0
(64-bit).

What I am doing here is creating a 7x7 pixel image from a 7x7 matrix. I
expect to see one pixel per data point, but that's not what I'm seeing.
Instead of a diagonal make up of single pixels, I get an odd 2x2 pixel blob
in the middle of the correct one pixel diagonal.

---------------------------------------------------------------------------
import numpy as np
import matplotlib.pylab as plt

if __name__ == "__main__":
    n = 7
    data = np.identity(n, float)

    # Create an nxn size figure with no frame
    fig = plt.figure(figsize=(n, n), frameon=False)

    # make the axes to the edge of the figure
    ax = plt.Axes(fig, [0.0, 0.0, 1.0, 1.0])
    # turn the axes off
    ax.set_axis_off()
    # add the axes to this figure
    fig.add_axes(ax)
    # show the data. Don't do any interpolation.
    ax.imshow(data, interpolation='nearest', origin='lower',aspect='auto')
    # Save the figure at 1 dot per inch, which should mean 1 data point per
    # pixel
    fig.savefig("image.png", dpi=1)

---------------------------------------------------------------------------

Since I'm not sure that if I can attach the png image I get, here is a ppm
version of the image I get (between the ------). Save this image.ppm minus
the dashes and you should be able to open it in something like gimp.

---------------------------------------------------------------------------
P3
# CREATOR: GIMP PNM Filter Version 1.1
7 7
255
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
---------------------------------------------------------------------------

Thanks.
Christine

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users at python.org
Matplotlib-users Info Page

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/matplotlib-users/attachments/20151117/dcc347ec/attachment.html&gt;

I can confirm this. The issue is notable with a dpi lower than 10 or so and
seems to get worse as it is lowered towards 1.
Can you try plotting the image with interpolation='none' If I do that I get
the correct behaviour. 'none' is probably the correct setting if you wish
to match
image matrix 1to1 to png coords anyway.

@nathan The image in the notebook is plotted with a different dpi and works
correctly.

best Jens

···

On Tue, 17 Nov 2015 at 22:38 Nathan Goldbaum <nathan12343 at gmail.com> wrote:

This seems to be working ok for me:
Untitled3.ipynb · GitHub

On Tue, Nov 17, 2015 at 4:22 PM, Smit, Christine E. (GSFC-610.2)[TELOPHASE > CORP] <christine.e.smit at nasa.gov> wrote:

Hi! I am using matplotlib v 1.4.3 with Python 2.7.10 :: Anaconda 2.4.0
(64-bit).

What I am doing here is creating a 7x7 pixel image from a 7x7 matrix. I
expect to see one pixel per data point, but that's not what I'm seeing.
Instead of a diagonal make up of single pixels, I get an odd 2x2 pixel blob
in the middle of the correct one pixel diagonal.

---------------------------------------------------------------------------
import numpy as np
import matplotlib.pylab as plt

if __name__ == "__main__":
    n = 7
    data = np.identity(n, float)

    # Create an nxn size figure with no frame
    fig = plt.figure(figsize=(n, n), frameon=False)

    # make the axes to the edge of the figure
    ax = plt.Axes(fig, [0.0, 0.0, 1.0, 1.0])
    # turn the axes off
    ax.set_axis_off()
    # add the axes to this figure
    fig.add_axes(ax)
    # show the data. Don't do any interpolation.
    ax.imshow(data, interpolation='nearest', origin='lower',aspect='auto')
    # Save the figure at 1 dot per inch, which should mean 1 data point
per
    # pixel
    fig.savefig("image.png", dpi=1)

---------------------------------------------------------------------------

Since I'm not sure that if I can attach the png image I get, here is a
ppm version of the image I get (between the ------). Save this image.ppm
minus the dashes and you should be able to open it in something like gimp.

---------------------------------------------------------------------------
P3
# CREATOR: GIMP PNM Filter Version 1.1
7 7
255
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127

---------------------------------------------------------------------------

Thanks.
Christine

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users at python.org
Matplotlib-users Info Page

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users at python.org
Matplotlib-users Info Page

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/matplotlib-users/attachments/20151118/133c6249/attachment-0001.html&gt;

Yes. It works with 'none.' The problem is that sometimes we need to create images with low inflation factors. So, our data is nxm data points and we want a 2nx2m image or a 3nx3m image. We're currently getting around this bug by using 'none' to create an nxm image and then using imagemagick's convert to resize.

···

From: Jens Nielsen <jenshnielsen at gmail.com<mailto:jenshnielsen@gmail.com>>
Date: Wednesday, November 18, 2015 at 6:28 AM
To: Nathan Goldbaum <nathan12343 at gmail.com<mailto:nathan12343 at gmail.com>>, csmit <christine.e.smit at nasa.gov<mailto:christine.e.smit at nasa.gov>>
Cc: "matplotlib-users at python.org<mailto:matplotlib-users at python.org>" <matplotlib-users at python.org<mailto:matplotlib-users at python.org>>
Subject: Re: [Matplotlib-users] odd behavior with 'nearest' interpolation

I can confirm this. The issue is notable with a dpi lower than 10 or so and seems to get worse as it is lowered towards 1.
Can you try plotting the image with interpolation='none' If I do that I get the correct behaviour. 'none' is probably the correct setting if you wish to match
image matrix 1to1 to png coords anyway.

@nathan The image in the notebook is plotted with a different dpi and works correctly.

best Jens

On Tue, 17 Nov 2015 at 22:38 Nathan Goldbaum <nathan12343 at gmail.com<mailto:nathan12343 at gmail.com>> wrote:
This seems to be working ok for me: https://gist.github.com/faa6b4008a8e3db68f46

On Tue, Nov 17, 2015 at 4:22 PM, Smit, Christine E. (GSFC-610.2)[TELOPHASE CORP] <christine.e.smit at nasa.gov<mailto:christine.e.smit at nasa.gov>> wrote:
Hi! I am using matplotlib v 1.4.3 with Python 2.7.10 :: Anaconda 2.4.0 (64-bit).

What I am doing here is creating a 7x7 pixel image from a 7x7 matrix. I expect to see one pixel per data point, but that's not what I'm seeing. Instead of a diagonal make up of single pixels, I get an odd 2x2 pixel blob in the middle of the correct one pixel diagonal.

---------------------------------------------------------------------------
import numpy as np
import matplotlib.pylab as plt

if __name__ == "__main__":
    n = 7
    data = np.identity(n, float)

    # Create an nxn size figure with no frame
    fig = plt.figure(figsize=(n, n), frameon=False)

    # make the axes to the edge of the figure
    ax = plt.Axes(fig, [0.0, 0.0, 1.0, 1.0])
    # turn the axes off
    ax.set_axis_off()
    # add the axes to this figure
    fig.add_axes(ax)
    # show the data. Don't do any interpolation.
    ax.imshow(data, interpolation='nearest', origin='lower',aspect='auto')
    # Save the figure at 1 dot per inch, which should mean 1 data point per
    # pixel
    fig.savefig("image.png", dpi=1)

---------------------------------------------------------------------------

Since I'm not sure that if I can attach the png image I get, here is a ppm version of the image I get (between the ------). Save this image.ppm minus the dashes and you should be able to open it in something like gimp.

---------------------------------------------------------------------------
P3
# CREATOR: GIMP PNM Filter Version 1.1
7 7
255
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
---------------------------------------------------------------------------

Thanks.
Christine

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users at python.org<mailto:Matplotlib-users at python.org>
https://mail.python.org/mailman/listinfo/matplotlib-users

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users at python.org<mailto:Matplotlib-users at python.org>
https://mail.python.org/mailman/listinfo/matplotlib-users
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/matplotlib-users/attachments/20151119/3c5bfcfe/attachment.html>

It seem like this is a genuine bug but I am not sure how to fix it. Can you
submit a bug report at Github so we are sure that this is captured? At
github you can attach pictures

Best Jens

···

On Thu, 19 Nov 2015 at 14:25 Smit, Christine E. (GSFC-610.2)[TELOPHASE CORP] <christine.e.smit at nasa.gov> wrote:

Yes. It works with 'none.' The problem is that sometimes we need to create
images with low inflation factors. So, our data is nxm data points and we
want a 2nx2m image or a 3nx3m image. We're currently getting around this
bug by using 'none' to create an nxm image and then using imagemagick's
convert to resize.

From: Jens Nielsen <jenshnielsen at gmail.com>
Date: Wednesday, November 18, 2015 at 6:28 AM
To: Nathan Goldbaum <nathan12343 at gmail.com>, csmit <
christine.e.smit at nasa.gov>
Cc: "matplotlib-users at python.org" <matplotlib-users at python.org>
Subject: Re: [Matplotlib-users] odd behavior with 'nearest' interpolation

I can confirm this. The issue is notable with a dpi lower than 10 or so
and seems to get worse as it is lowered towards 1.
Can you try plotting the image with interpolation='none' If I do that I
get the correct behaviour. 'none' is probably the correct setting if you
wish to match
image matrix 1to1 to png coords anyway.

@nathan The image in the notebook is plotted with a different dpi and
works correctly.

best Jens

On Tue, 17 Nov 2015 at 22:38 Nathan Goldbaum <nathan12343 at gmail.com> > wrote:

This seems to be working ok for me:
Untitled3.ipynb · GitHub

On Tue, Nov 17, 2015 at 4:22 PM, Smit, Christine E. >> (GSFC-610.2)[TELOPHASE CORP] <christine.e.smit at nasa.gov> wrote:

Hi! I am using matplotlib v 1.4.3 with Python 2.7.10 :: Anaconda 2.4.0
(64-bit).

What I am doing here is creating a 7x7 pixel image from a 7x7 matrix. I
expect to see one pixel per data point, but that's not what I'm seeing.
Instead of a diagonal make up of single pixels, I get an odd 2x2 pixel blob
in the middle of the correct one pixel diagonal.

---------------------------------------------------------------------------
import numpy as np
import matplotlib.pylab as plt

if __name__ == "__main__":
    n = 7
    data = np.identity(n, float)

    # Create an nxn size figure with no frame
    fig = plt.figure(figsize=(n, n), frameon=False)

    # make the axes to the edge of the figure
    ax = plt.Axes(fig, [0.0, 0.0, 1.0, 1.0])
    # turn the axes off
    ax.set_axis_off()
    # add the axes to this figure
    fig.add_axes(ax)
    # show the data. Don't do any interpolation.
    ax.imshow(data, interpolation='nearest',
origin='lower',aspect='auto')
    # Save the figure at 1 dot per inch, which should mean 1 data point
per
    # pixel
    fig.savefig("image.png", dpi=1)

---------------------------------------------------------------------------

Since I'm not sure that if I can attach the png image I get, here is a
ppm version of the image I get (between the ------). Save this image.ppm
minus the dashes and you should be able to open it in something like gimp.

---------------------------------------------------------------------------
P3
# CREATOR: GIMP PNM Filter Version 1.1
7 7
255
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127

---------------------------------------------------------------------------

Thanks.
Christine

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users at python.org
Matplotlib-users Info Page

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users at python.org
Matplotlib-users Info Page

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/matplotlib-users/attachments/20151119/265c6ed6/attachment-0001.html&gt;

Thanks! I have. https://github.com/matplotlib/matplotlib/issues/5520

···

From: Jens Nielsen <jenshnielsen at gmail.com<mailto:jenshnielsen@gmail.com>>
Date: Thursday, November 19, 2015 at 9:34 AM
To: csmit <christine.e.smit at nasa.gov<mailto:christine.e.smit at nasa.gov>>, Nathan Goldbaum <nathan12343 at gmail.com<mailto:nathan12343 at gmail.com>>
Cc: "matplotlib-users at python.org<mailto:matplotlib-users at python.org>" <matplotlib-users at python.org<mailto:matplotlib-users at python.org>>
Subject: Re: [Matplotlib-users] odd behavior with 'nearest' interpolation

It seem like this is a genuine bug but I am not sure how to fix it. Can you submit a bug report at Github so we are sure that this is captured? At github you can attach pictures

Best Jens

On Thu, 19 Nov 2015 at 14:25 Smit, Christine E. (GSFC-610.2)[TELOPHASE CORP] <christine.e.smit at nasa.gov<mailto:christine.e.smit at nasa.gov>> wrote:
Yes. It works with 'none.' The problem is that sometimes we need to create images with low inflation factors. So, our data is nxm data points and we want a 2nx2m image or a 3nx3m image. We're currently getting around this bug by using 'none' to create an nxm image and then using imagemagick's convert to resize.

From: Jens Nielsen <jenshnielsen at gmail.com<mailto:jenshnielsen@gmail.com>>
Date: Wednesday, November 18, 2015 at 6:28 AM
To: Nathan Goldbaum <nathan12343 at gmail.com<mailto:nathan12343 at gmail.com>>, csmit <christine.e.smit at nasa.gov<mailto:christine.e.smit at nasa.gov>>
Cc: "matplotlib-users at python.org<mailto:matplotlib-users at python.org>" <matplotlib-users at python.org<mailto:matplotlib-users at python.org>>
Subject: Re: [Matplotlib-users] odd behavior with 'nearest' interpolation

I can confirm this. The issue is notable with a dpi lower than 10 or so and seems to get worse as it is lowered towards 1.
Can you try plotting the image with interpolation='none' If I do that I get the correct behaviour. 'none' is probably the correct setting if you wish to match
image matrix 1to1 to png coords anyway.

@nathan The image in the notebook is plotted with a different dpi and works correctly.

best Jens

On Tue, 17 Nov 2015 at 22:38 Nathan Goldbaum <nathan12343 at gmail.com<mailto:nathan12343 at gmail.com>> wrote:
This seems to be working ok for me: https://gist.github.com/faa6b4008a8e3db68f46

On Tue, Nov 17, 2015 at 4:22 PM, Smit, Christine E. (GSFC-610.2)[TELOPHASE CORP] <christine.e.smit at nasa.gov<mailto:christine.e.smit at nasa.gov>> wrote:
Hi! I am using matplotlib v 1.4.3 with Python 2.7.10 :: Anaconda 2.4.0 (64-bit).

What I am doing here is creating a 7x7 pixel image from a 7x7 matrix. I expect to see one pixel per data point, but that's not what I'm seeing. Instead of a diagonal make up of single pixels, I get an odd 2x2 pixel blob in the middle of the correct one pixel diagonal.

---------------------------------------------------------------------------
import numpy as np
import matplotlib.pylab as plt

if __name__ == "__main__":
    n = 7
    data = np.identity(n, float)

    # Create an nxn size figure with no frame
    fig = plt.figure(figsize=(n, n), frameon=False)

    # make the axes to the edge of the figure
    ax = plt.Axes(fig, [0.0, 0.0, 1.0, 1.0])
    # turn the axes off
    ax.set_axis_off()
    # add the axes to this figure
    fig.add_axes(ax)
    # show the data. Don't do any interpolation.
    ax.imshow(data, interpolation='nearest', origin='lower',aspect='auto')
    # Save the figure at 1 dot per inch, which should mean 1 data point per
    # pixel
    fig.savefig("image.png", dpi=1)

---------------------------------------------------------------------------

Since I'm not sure that if I can attach the png image I get, here is a ppm version of the image I get (between the ------). Save this image.ppm minus the dashes and you should be able to open it in something like gimp.

---------------------------------------------------------------------------
P3
# CREATOR: GIMP PNM Filter Version 1.1
7 7
255
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
---------------------------------------------------------------------------

Thanks.
Christine

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users at python.org<mailto:Matplotlib-users at python.org>
https://mail.python.org/mailman/listinfo/matplotlib-users

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users at python.org<mailto:Matplotlib-users at python.org>
https://mail.python.org/mailman/listinfo/matplotlib-users
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/matplotlib-users/attachments/20151119/f4a0f1e9/attachment.html>

Thanks! I have. 'nearest' interpolation not working with low dpi · Issue #5520 · matplotlib/matplotlib · GitHub

FYI: If you want to write a numpy array directly to a PNG file, you
can use numpngw:

* github: GitHub - WarrenWeckesser/numpngw: Functions that create PNG and animated PNG files from numpy arrays.
* pypi: numpngw · PyPI

Warren

(Christine, sorry for the double email. I forgot to "reply all".)

···

On 11/19/15, Smit, Christine E. (GSFC-610.2)[TELOPHASE CORP] <christine.e.smit at nasa.gov> wrote:

From: Jens Nielsen <jenshnielsen at gmail.com<mailto:jenshnielsen at gmail.com>>
Date: Thursday, November 19, 2015 at 9:34 AM
To: csmit <christine.e.smit at nasa.gov<mailto:christine.e.smit at nasa.gov>>,
Nathan Goldbaum <nathan12343 at gmail.com<mailto:nathan12343 at gmail.com>>
Cc: "matplotlib-users at python.org<mailto:matplotlib-users at python.org>"
<matplotlib-users at python.org<mailto:matplotlib-users at python.org>>
Subject: Re: [Matplotlib-users] odd behavior with 'nearest' interpolation

It seem like this is a genuine bug but I am not sure how to fix it. Can you
submit a bug report at Github so we are sure that this is captured? At
github you can attach pictures

Best Jens

On Thu, 19 Nov 2015 at 14:25 Smit, Christine E. (GSFC-610.2)[TELOPHASE CORP] > <christine.e.smit at nasa.gov<mailto:christine.e.smit at nasa.gov>> wrote:
Yes. It works with 'none.' The problem is that sometimes we need to create
images with low inflation factors. So, our data is nxm data points and we
want a 2nx2m image or a 3nx3m image. We're currently getting around this bug
by using 'none' to create an nxm image and then using imagemagick's convert
to resize.

From: Jens Nielsen <jenshnielsen at gmail.com<mailto:jenshnielsen at gmail.com>>
Date: Wednesday, November 18, 2015 at 6:28 AM
To: Nathan Goldbaum <nathan12343 at gmail.com<mailto:nathan12343 at gmail.com>>,
csmit <christine.e.smit at nasa.gov<mailto:christine.e.smit at nasa.gov>>
Cc: "matplotlib-users at python.org<mailto:matplotlib-users at python.org>"
<matplotlib-users at python.org<mailto:matplotlib-users at python.org>>
Subject: Re: [Matplotlib-users] odd behavior with 'nearest' interpolation

I can confirm this. The issue is notable with a dpi lower than 10 or so and
seems to get worse as it is lowered towards 1.
Can you try plotting the image with interpolation='none' If I do that I get
the correct behaviour. 'none' is probably the correct setting if you wish to
match
image matrix 1to1 to png coords anyway.

@nathan The image in the notebook is plotted with a different dpi and works
correctly.

best Jens

On Tue, 17 Nov 2015 at 22:38 Nathan Goldbaum > <nathan12343 at gmail.com<mailto:nathan12343 at gmail.com>> wrote:
This seems to be working ok for me:
Untitled3.ipynb · GitHub

On Tue, Nov 17, 2015 at 4:22 PM, Smit, Christine E. (GSFC-610.2)[TELOPHASE > CORP] <christine.e.smit at nasa.gov<mailto:christine.e.smit at nasa.gov>> wrote:
Hi! I am using matplotlib v 1.4.3 with Python 2.7.10 :: Anaconda 2.4.0
(64-bit).

What I am doing here is creating a 7x7 pixel image from a 7x7 matrix. I
expect to see one pixel per data point, but that's not what I'm seeing.
Instead of a diagonal make up of single pixels, I get an odd 2x2 pixel blob
in the middle of the correct one pixel diagonal.

---------------------------------------------------------------------------
import numpy as np
import matplotlib.pylab as plt

if __name__ == "__main__":
    n = 7
    data = np.identity(n, float)

    # Create an nxn size figure with no frame
    fig = plt.figure(figsize=(n, n), frameon=False)

    # make the axes to the edge of the figure
    ax = plt.Axes(fig, [0.0, 0.0, 1.0, 1.0])
    # turn the axes off
    ax.set_axis_off()
    # add the axes to this figure
    fig.add_axes(ax)
    # show the data. Don't do any interpolation.
    ax.imshow(data, interpolation='nearest', origin='lower',aspect='auto')
    # Save the figure at 1 dot per inch, which should mean 1 data point per
    # pixel
    fig.savefig("image.png", dpi=1)

---------------------------------------------------------------------------

Since I'm not sure that if I can attach the png image I get, here is a ppm
version of the image I get (between the ------). Save this image.ppm minus
the dashes and you should be able to open it in something like gimp.

---------------------------------------------------------------------------
P3
# CREATOR: GIMP PNM Filter Version 1.1
7 7
255
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
---------------------------------------------------------------------------

Thanks.
Christine

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users at python.org<mailto:Matplotlib-users at python.org>
Matplotlib-users Info Page

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users at python.org<mailto:Matplotlib-users at python.org>
Matplotlib-users Info Page

That looks interesting. It's definitely what we are currently trying to
do. Thank you for mentioning it.

···

On 11/19/15, 3:26 PM, "Warren Weckesser" <warren.weckesser at gmail.com> wrote:

On 11/19/15, Smit, Christine E. (GSFC-610.2)[TELOPHASE CORP] ><christine.e.smit at nasa.gov> wrote:

Thanks! I have. 'nearest' interpolation not working with low dpi · Issue #5520 · matplotlib/matplotlib · GitHub

FYI: If you want to write a numpy array directly to a PNG file, you
can use numpngw:

* github: GitHub - WarrenWeckesser/numpngw: Functions that create PNG and animated PNG files from numpy arrays.
* pypi: numpngw · PyPI

Warren

(Christine, sorry for the double email. I forgot to "reply all".)

From: Jens Nielsen
<jenshnielsen at gmail.com<mailto:jenshnielsen at gmail.com>>
Date: Thursday, November 19, 2015 at 9:34 AM
To: csmit <christine.e.smit at nasa.gov<mailto:christine.e.smit at nasa.gov>>,
Nathan Goldbaum <nathan12343 at gmail.com<mailto:nathan12343 at gmail.com>>
Cc: "matplotlib-users at python.org<mailto:matplotlib-users at python.org>"
<matplotlib-users at python.org<mailto:matplotlib-users at python.org>>
Subject: Re: [Matplotlib-users] odd behavior with 'nearest'
interpolation

It seem like this is a genuine bug but I am not sure how to fix it. Can
you
submit a bug report at Github so we are sure that this is captured? At
github you can attach pictures

Best Jens

On Thu, 19 Nov 2015 at 14:25 Smit, Christine E. (GSFC-610.2)[TELOPHASE >>CORP] >> <christine.e.smit at nasa.gov<mailto:christine.e.smit at nasa.gov>> wrote:
Yes. It works with 'none.' The problem is that sometimes we need to
create
images with low inflation factors. So, our data is nxm data points and
we
want a 2nx2m image or a 3nx3m image. We're currently getting around
this bug
by using 'none' to create an nxm image and then using imagemagick's
convert
to resize.

From: Jens Nielsen
<jenshnielsen at gmail.com<mailto:jenshnielsen at gmail.com>>
Date: Wednesday, November 18, 2015 at 6:28 AM
To: Nathan Goldbaum
<nathan12343 at gmail.com<mailto:nathan12343 at gmail.com>>,
csmit <christine.e.smit at nasa.gov<mailto:christine.e.smit at nasa.gov>>
Cc: "matplotlib-users at python.org<mailto:matplotlib-users at python.org>"
<matplotlib-users at python.org<mailto:matplotlib-users at python.org>>
Subject: Re: [Matplotlib-users] odd behavior with 'nearest'
interpolation

I can confirm this. The issue is notable with a dpi lower than 10 or so
and
seems to get worse as it is lowered towards 1.
Can you try plotting the image with interpolation='none' If I do that I
get
the correct behaviour. 'none' is probably the correct setting if you
wish to
match
image matrix 1to1 to png coords anyway.

@nathan The image in the notebook is plotted with a different dpi and
works
correctly.

best Jens

On Tue, 17 Nov 2015 at 22:38 Nathan Goldbaum >> <nathan12343 at gmail.com<mailto:nathan12343 at gmail.com>> wrote:
This seems to be working ok for me:
Untitled3.ipynb · GitHub

On Tue, Nov 17, 2015 at 4:22 PM, Smit, Christine E. >>(GSFC-610.2)[TELOPHASE >> CORP] <christine.e.smit at nasa.gov<mailto:christine.e.smit at nasa.gov>> >>wrote:
Hi! I am using matplotlib v 1.4.3 with Python 2.7.10 :: Anaconda 2.4.0
(64-bit).

What I am doing here is creating a 7x7 pixel image from a 7x7 matrix. I
expect to see one pixel per data point, but that's not what I'm seeing.
Instead of a diagonal make up of single pixels, I get an odd 2x2 pixel
blob
in the middle of the correct one pixel diagonal.

-------------------------------------------------------------------------
--
import numpy as np
import matplotlib.pylab as plt

if __name__ == "__main__":
    n = 7
    data = np.identity(n, float)

    # Create an nxn size figure with no frame
    fig = plt.figure(figsize=(n, n), frameon=False)

    # make the axes to the edge of the figure
    ax = plt.Axes(fig, [0.0, 0.0, 1.0, 1.0])
    # turn the axes off
    ax.set_axis_off()
    # add the axes to this figure
    fig.add_axes(ax)
    # show the data. Don't do any interpolation.
    ax.imshow(data, interpolation='nearest',
origin='lower',aspect='auto')
    # Save the figure at 1 dot per inch, which should mean 1 data point
per
    # pixel
    fig.savefig("image.png", dpi=1)

-------------------------------------------------------------------------
--

Since I'm not sure that if I can attach the png image I get, here is a
ppm
version of the image I get (between the ------). Save this image.ppm
minus
the dashes and you should be able to open it in something like gimp.

-------------------------------------------------------------------------
--
P3
# CREATOR: GIMP PNM Filter Version 1.1
7 7
255
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
127
0
0
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127
0
0
127

-------------------------------------------------------------------------
--

Thanks.
Christine

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users at python.org<mailto:Matplotlib-users at python.org>
Matplotlib-users Info Page

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users at python.org<mailto:Matplotlib-users at python.org>
Matplotlib-users Info Page