Attached is a simple example that illustrates the method. What threw me
off last night is that the copy_bbox_transform() function was not doing
what I expected. I don't know yet whether this is because of a bug or a
misunderstanding on my part, but in any case, the example provides an
alternative. (It is not valid for any bbox transform, but I think it
will be fine in normal use cases.) The basic method can be used on any
artist by calling set_offset on that artist's transform. Once again,
John's transform module works its magic!
I will make a more complete example and include it in the examples
subdirectory of mpl. This is really great functionality that needs to
be made more readily accessible.
Eric
John Hunter wrote:
"Eric" == Eric Firing <[EMAIL PROTECTED]> writes:
Eric> I think that what you want to do requires something like the
Eric> mechanism in QuiverKey: a derived artist with a draw method
Eric> that figures out at draw time where to put the text; I don't
Eric> think there is any other way to handle zooming while keeping
Eric> the screen separation from a data point fixed.
You can do this using offsets -- see
matplotlib.axis.XTick._get_text1. This is how tick labeling is done
(a point offset from an x location in data coords and a y location in
axis coords). Here is an example -- you have to copy the default data
transform so that the offset doesn't affect the figure data
from matplotlib.transforms import Value,
translation_transform,blend_xy_sep_transform
from pylab import figure, show
fig = figure()
ax = fig.add_subplot(111)
points = 7
pad = fig.dpi*Value(points/72.0)
# poor man's copy
trans = blend_xy_sep_transform(ax.transData, ax.transData)
# to the left and above
offset = translation_transform(Value(-1)*pad, pad)
trans.set_offset( (0,0), offset)
ax.plot([1,2,3])
t = ax.text(1,2, 'hi', transform=trans)
show()
import pylab as P
from matplotlib.transforms import translation_transform, copy_bbox_transform
from matplotlib.transforms import Value, identity_transform, get_bbox_transform
x = P.arange(5)
y = P.rand(5)
ax = P.subplot(1,1,1)
# copy_bbox_transform does not seem to work
#trans = copy_bbox_transform(ax.transData)
# Effectively doing a manual copy does work:
trans = get_bbox_transform(ax.transData.get_bbox1(),
ax.transData.get_bbox2())
transOffset = translation_transform(Value(10), Value(0)) # Alternative 1
transIdent = identity_transform() # Alternative 2
#trans.set_offset((0, 0), transOffset ) # Alternative 1
trans.set_offset((10,0), transIdent) # Alternative 2
for x, y in zip(x,y):
P.plot((x,),(y,), 'ro')
P.text(x, y, '%0.3f' % y, transform=trans)
P.show()
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Matplotlib-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-users