aspect ratio bug?

I just sent this to the matplotlib-users list, but noticed it's been abandoned, or at least unused since August. I'm reposting here and adding the info I forgot on the other list. Sorry if you get this twice.

This is running matplotlib 1.1.1 installed with pip on
Linux savoie 2.6.32.59-0.7-default #1 SMP 2012-07-13 15:50:56 +0200 x86_64 x86_64 x86_64 GNU/Linux

(But I also tested with MPL:1.2)

Hi there,

I've boiled down a problem and while the following my look useless, I need to understand why matplotlib is behaving like it is.

Below is code showing my issue. I don't believe the issue is with the "bbox_inches='tight'", if you leave that off, my image is indeed, 800x1400, but the last row is a row of transparent pixels(on linux/not mac). It's difficult to see unless you use the imagemagik command display.

The basic problem is that when my data has an aspect ratio very close to 1.75, the image gets changed to one with an aspect of 1.74875.

Correct figure info 8x14@...1110... = 800x1400 => 1.75 Aspect Ratio.
Incorrect figure info => 800x1399 => 1.74875

Data that works aspect ratio: 1.7499999999999998
Data that fails aspect ratio: 1.7499999999999996
---> Srsly?! -------------------------------^

It would be great if someone could explain to me what's happening if this is indeed working as expected. If it's not, it would be great if someone could fix it.

Thanks in advance.
Matt

import matplotlib.pyplot as plt

def create_image():
    # I want an 800x1400 image (aspect = 1400/800 = 1.75.
    fig = plt.figure(1, figsize=(8, 14), frameon=False, dpi=100)

    # Use the whole figure and fill with a patch.
    fig.add_axes([0, 0, 1, 1])
    ax = plt.gca()
    limb = ax.axesPatch
    limb.set_facecolor('#6587ad')

    # Set some bounds with Aspects very close to the desired aspect ratios.
    x1 = 0.0
    y1 = 0.0
    x2 = 16.

    # If you un-comment out this line (and comment the one below). I get an image I expect
    # y2 = 27.999999999999994671 # produces 800 x 1400 image
    # aspect = 1.7499999999999998 works

    # Use this line and I get and image the wrong size (or with transparent pixels.)
    y2 = 27.999999999999994670 # produces (wrong?) 800 x 1399 image
    # aspect = 1.7499999999999996 Fails? wat?

    corners = ((x1, y1), (x2, y2))
    ax.update_datalim(corners)
    ax.set_xlim((x1, x2))
    ax.set_ylim((y1, y2))

    ax.set_aspect('equal', anchor='C')
    ax.set_xticks([])
    ax.set_yticks([])

    plt.savefig('rectangle.png', pad_inches=0.0, bbox_inches='tight')

    # If you use this below, the file size is correct, but there is a single
    # line transparent pixels along the bottom of the image

    # plt.savefig('rectangle.png', pad_inches=0.0)

if __name__ == '__main__':
    create_image()