Hi again, developers. I found that Axes.autoscale_view, and therefore
Axes.autoscale, won't scale loosely when all of the children are images.
Passing tight=False yields behavior just like tight=None. The attached script
demonstrates this. In contrast, the docs for autoscale indicate that
tight=False should force loose scaling. I believe the attached patch yields
the desireable and documented behavior; would you please review it? Thank you.

For those who might need to work around the issue, the following can
accomplish a loose scaling:

axes.autoscale_view()  # tight scaling to image extent
axes.set_xbound(
        *axes.xaxis.get_major_locator().view_limits(
            *axes.get_xbound()))
axes.set_ybound(
        *axes.yaxis.get_major_locator().view_limits(
            *axes.get_ybound()))


"""
Demonstrates that, as of v. 1.0.0, Axes.autoscale_view always uses tight 
scaling when all children are images, regardless of the passed *tight* 
parameter.  Effectively, tight=False acts like tight=None.
"""

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.ticker as mtick

field = np.array([[0, 1], [1, 0]])  # image data
extent = l, r, b, t = (-1.5, 1.5, -1.5, 1.5)  # Extents will lie between ticks.
tight_seq = (None, False, True)  # values of *tight* to test

# Make two rows and a column of subplots for each *tight* value.
fig, axes = plt.subplots(2, len(tight_seq))
for ax in axes.flat:                                      # In all subplots, 
    ax.imshow(field, extent=extent)                       # show the image
    ax.xaxis.set_major_locator(mtick.MultipleLocator(1))  # and set locators.
    ax.yaxis.set_major_locator(mtick.MultipleLocator(1))
for ax in axes[1]:                 # In the second row, 
    ax.plot([l, r], [b, t], 'g-')  # plot a line across the image.
for ax_row in axes:
    for (ax, tight) in zip(ax_row, tight_seq):  # Apply each *tight* value
        ax.autoscale_view(tight=tight)          # to the subplot...
        if ax.is_first_row():
            ax.set_title('tight = %s' % tight)  # and title.
plt.show()

Attachment: axes.Axes.autoscale_view.patch
Description: Binary data

------------------------------------------------------------------------------
Beautiful is writing same markup. Internet Explorer 9 supports
standards for HTML5, CSS3, SVG 1.1,  ECMAScript5, and DOM L2 & L3.
Spend less time writing and  rewriting code and more time creating great
experiences on the web. Be a part of the beta today.
http://p.sf.net/sfu/beautyoftheweb
_______________________________________________
Matplotlib-devel mailing list
Matplotlib-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-devel

Reply via email to