How can I get the actual axis limits when using ax.axis('equal')?
<p>I am using <code>ax.axes('equal')</code> to make the axis spacing equal on X and Y, and also setting <code>xlim</code> and <code>ylim</code>. This over-constrains the problem and the actual limits are not what I set in <code>ax.set_xlim()</code> or <code>ax.set_ylim()</code>. Using <code>ax.get_xlim()</code> just returns what I provided. How can I get the actual visible limits of the plot?</p>

<pre><code>f,ax=plt.subplots(1) #open a figure
ax.axis('equal') #make the axes have equal spacing
ax.plot([0,20],[0,20]) #test data set

#change the plot axis limits
ax.set_xlim([2,18]) 
ax.set_ylim([5,15])

#read the plot axis limits
xlim2=array(ax.get_xlim())
ylim2=array(ax.get_ylim())

#define indices for drawing a rectangle with xlim2, ylim2
sqx=array([0,1,1,0,0])
sqy=array([0,0,1,1,0])

#plot a thick rectangle marking the xlim2, ylim2
ax.plot(xlim2[sqx],ylim2[sqy],lw=3) #this does not go all the way around the edge
</code></pre>

<p>What commands will let me draw the green box around the actual edges of the figure? </p>

<p><a href="http://i.stack.imgur.com/Z14Jg.png" rel="nofollow"><img src="http://i.stack.imgur.com/Z14Jg.png" alt="Plot showing that the results of get_xlim() and get_ylim() do not match the visible bounds of the figure"></a></p>

<p>Related: <a href="http://stackoverflow.com/questions/39775709/how-to-enforce-both-xlim-and-ylim-while-using-ax-axesequal/39795483#39795483" title="Force xlim, ylim, and axes&#40;&#39;equal&#39;&#41; at the same time by letting margins auto-adjust">Force <code>xlim</code>, <code>ylim</code>, and <code>axes('equal')</code> at the same time by letting margins auto-adjust</a> </p>

<p>Not to detract from the accepted answer, which does solve the problem of getting updated axis limits, but is this perhaps an example of the XY problem?   If what you want to do is draw a box around the axes, then you don't actually <em>need</em> the <code>xlim</code> and <code>ylim</code> in data coordinates.  Instead, you just need to use the <code>ax.transAxes</code> transform which causes both <code>x</code> and <code>y</code> data to be interpreted in normalized coordinates instead of data-centered coordinates:</p>

<pre><code>ax.plot([0,0,1,1,0],[0,1,1,0,0], lw=3, transform=ax.transAxes)
</code></pre>

<p>The great thing about this is that your line will stay around the edges of the axes <strong><em>even if the <code>xlim</code> and <code>ylim</code> subsequently change</em></strong>.</p>

<p>You can also use <code>transform=ax.xaxis.get_transform()</code> or <code>transform=ax.yaxis.get_transform()</code> if you want only <code>x</code> or only <code>y</code> to be defined in normalized coordinates, with the other one in data coordinates.</p>

python python-2.7 matplotlib plot