Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

Already on GitHub? Sign in to your account

External transform api #1090

Merged
merged 4 commits into from Aug 20, 2012

Conversation

Projects
None yet
3 participants
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)
Member

WeatherGod commented Aug 17, 2012

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.

Member

pelson commented Aug 20, 2012

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

efiring added a commit that referenced this pull request Aug 20, 2012

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

Owner

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

Owner

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

Owner

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