External transform api #1090

Merged
merged 4 commits into from Aug 20, 2012

Projects

None yet

3 participants

@pelson
Member
pelson commented Aug 15, 2012

This PR adds an easy interface for matplotlib transform creation based on a custom object.

The syntax looks like:

class MyObject(object):
    def _as_mpl_transform(self, axes):
        return ... # a matplotlib transform instance

This interface is comprable to the _as_mpl_axes method to easily create axes from custom classes.

My primary usecase for both of these cases is to provide an interface which could do something like:

plate_carree = MyProjectionLibrary.PlateCarree()
robinson = MyProjectionLibrary.Robinson()

ax = plt.axes(projection=robinson)
plt.plot(lons, lats, transform=plate_carree)
@WeatherGod
Member

Could this be useful for basemap? @jswhit, this PR might be of interest to you.

@WeatherGod WeatherGod commented on an outdated diff Aug 17, 2012
lib/matplotlib/artist.py
@@ -233,6 +234,8 @@ def get_transform(self):
"""
if self._transform is None:
self._transform = IdentityTransform()
+ elif not isinstance(self._transform, Transform) and hasattr(self._transform, '_as_mpl_transform'):
@WeatherGod
WeatherGod Aug 17, 2012 Member

As per PEP8, please keep lines under 80 chars long.

@pelson
Member
pelson commented Aug 20, 2012

Seems like there isn't much complaint about this PR. Anyone willing to merge?

@efiring efiring merged commit c0ee100 into matplotlib:master Aug 20, 2012
@efiring
Member
efiring commented Aug 20, 2012

On 2012/08/19 9:34 PM, Phil Elson wrote:

Seems like there isn't much complaint about this PR. Anyone willing to
merge?
Done.

@efiring efiring commented on the diff Aug 20, 2012
lib/matplotlib/artist.py
@@ -3,7 +3,8 @@
import matplotlib
import matplotlib.cbook as cbook
from matplotlib import docstring, rcParams
-from transforms import Bbox, IdentityTransform, TransformedBbox, TransformedPath
+from transforms import Bbox, IdentityTransform, TransformedBbox, \
@efiring
efiring Aug 20, 2012 Member

For later cleanup, at leisure: use parentheses instead of backslash; I'm pretty sure this is supported for 2.6 and later.

@efiring efiring commented on the diff Aug 20, 2012
lib/matplotlib/artist.py
@@ -233,6 +234,9 @@ def get_transform(self):
"""
if self._transform is None:
self._transform = IdentityTransform()
+ elif (not isinstance(self._transform, Transform)
+ and hasattr(self._transform, '_as_mpl_transform')):
@efiring
efiring Aug 20, 2012 Member

Is there any point in checking for the _as_mpl_transform attribute? If it is not None, and it is not a Transform, and it can't be made into one, shouldn't it just raise an exception? Or is the idea that something not inheriting from Transform can still function as if it did?

@pelson
pelson Aug 20, 2012 Member

The idea was simply to not break anything else that was already passing something fruity. I think it might just get down to the point where the transform_path etc. methods are called and blow up if they don't exist on the thing in self._transform, though I am not entirely sure.

I'm not too fussed either way, but I am happy to be less generous and just try calling the _as_mpl_transform method, and if it doesn't exist, oh well... what is your preference?

@pelson pelson commented on the diff Aug 30, 2012
lib/matplotlib/artist.py
@@ -223,7 +224,7 @@ def set_transform(self, t):
ACCEPTS: :class:`~matplotlib.transforms.Transform` instance
"""
self._transform = t
- self._transformSet = True
+ self._transformSet = t is not None
@pelson
pelson Aug 30, 2012 Member

Turns out this is bad. Reverted in #1176 (along with a suitable test).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment