Michael Droettboom wrote:
> Ah.  I wasn't quite clear on what you were trying to do before.
>
> There's actually a bit of "magic" in there that automatically adjusts 
> the xlabel so it is lower than the xtick values.  (If you rotate the 
> xtick values, you can see this in action).  So it actually does 
> position things how you want, but then when it goes to draw it is 
> automatically lowering the text a little to make room.
>
> Since I don't see an easy way around this magic, you could not use 
> xlabel at all and just add some Axes text:
>
>    from matplotlib import text
>    text = text.Text(1, 0, "Foo")
>    text.set_transform(offset_copy(axes.transAxes, axes.figure, x=5, 
> y=0, units='points'))
>    text.set_clip_on(False)
>    axes.add_artist(text)
>
> Completely non-obvious of course :)  If there's enough need for the 
> kind of xlabels you're making, we should probably provide a way to do 
> this directly, but it would have to be well-tested to ensure it didn't 
> break existing functionality.
>
Ah---I realized that there was some automagic positioning going on if I 
didn't use subplot.xaxis.set_label_coords (thank goodness that I can 
read the source!).  So now I have something that *almost* works 
perfectly.  Here is a complete example:


import matplotlib.pyplot as plt
import numpy as np
from matplotlib.transforms import offset_copy
fig = plt.figure()
x = np.linspace(0,2*np.pi,100)
y = 2*np.sin(x)
ax = fig.add_subplot(1,1,1)
ax.plot(x,y)

# works
xaxis='bottom'
not_xaxis='top'

# doesn't work
#xaxis='top'
#not_xaxis='bottom'

# works
yaxis='left'
not_yaxis='right'

# doesn't work
#yaxis='right'
#not_yaxis='left'



ax.spines[xaxis].set_position(('outward',10))
ax.xaxis.set_ticks_position(xaxis)
ax.spines[yaxis].set_position(('outward',10))
ax.yaxis.set_ticks_position(yaxis)

ax.spines[not_xaxis].set_color('none')
ax.spines[not_yaxis].set_color('none')


xlabel=ax.xaxis.get_label()
xlabel.set_horizontalalignment('left')
xlabel.set_verticalalignment('baseline')
trans=ax.spines[xaxis].get_transform()
labeltrans=offset_copy(trans, fig, x=8, y=0, units='points')
ax.xaxis.set_label_coords(x=1,y=0,transform=labeltrans)

ylabel=ax.yaxis.get_label()
ylabel.set_horizontalalignment('center')
ylabel.set_verticalalignment('center')
ylabel.set_rotation('horizontal')
trans=ax.spines[yaxis].get_transform()
labeltrans=offset_copy(trans, fig, x=0, y=12, units='points')
ax.yaxis.set_label_coords(x=0,y=1,transform=labeltrans)

ax.set_xlabel('x axis')
ax.set_ylabel('y axis')
 

fig.savefig('test.png',bbox_inches='tight')


When I make the x-axis the top spine, or the y-axis the right spine, 
though (uncomment the "doesn't work" parts above), the labels end up on 
the wrong side of the axes.  Any idea about what is going on here?  Is 
it related to the post I just made to matplotlib-devel entitled "spines 
with 'axes' positions show in wrong place?"?

Also, I was wondering if I should use the 
ax.spines[yaxis].get_spine_transform() instead of 
ax.spines[yaxis].get_transform().  It didn't seem to help in the above 
issue, but I wasn't sure what the difference was between 
get_spine_transform and get_transform was.

Thanks,

Jason

-- 
Jason Grout


------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to