1919from matplotlib .ticker import Formatter , Locator , NullLocator , FixedLocator , NullFormatter
2020from matplotlib .transforms import Affine2D , BboxTransformTo , Transform
2121
22+
2223class GeoAxes (Axes ):
23- """
24- An abstract base class for geographic projections
25- """
24+ """An abstract base class for geographic projections."""
2625 class ThetaFormatter (Formatter ):
2726 """
2827 Used to format the theta tick labels. Converts the native
@@ -247,28 +246,37 @@ def drag_pan(self, button, key, x, y):
247246 pass
248247
249248
250- class AitoffAxes (GeoAxes ):
251- name = 'aitoff'
249+ class _GeoTransform (Transform ):
250+ # Factoring out some common functionality.
251+ input_dims = 2
252+ output_dims = 2
253+ is_separable = False
252254
253- class AitoffTransform ( Transform ):
255+ def __init__ ( self , resolution ):
254256 """
255- The base Aitoff transform.
257+ Create a new geographical transform.
258+
259+ Resolution is the number of steps to interpolate between each input
260+ line segment to approximate its path in curved space.
256261 """
257- input_dims = 2
258- output_dims = 2
259- is_separable = False
262+ Transform .__init__ (self )
263+ self ._resolution = resolution
260264
261- def __init__ (self , resolution ):
262- """
263- Create a new Aitoff transform. Resolution is the number of steps
264- to interpolate between each input line segment to approximate its
265- path in curved Aitoff space.
266- """
267- Transform .__init__ (self )
268- self ._resolution = resolution
265+ def __str__ (self ):
266+ return "{}({})" .format (type (self ).__name__ , self ._resolution )
267+
268+ def transform_path_non_affine (self , path ):
269+ vertices = path .vertices
270+ ipath = path .interpolated (self ._resolution )
271+ return Path (self .transform (ipath .vertices ), ipath .codes )
272+ transform_path_non_affine .__doc__ = Transform .transform_path_non_affine .__doc__
273+
274+
275+ class AitoffAxes (GeoAxes ):
276+ name = 'aitoff'
269277
270- def __str__ ( self ):
271- return "{}({})" . format ( type ( self ). __name__ , self . _resolution )
278+ class AitoffTransform ( _GeoTransform ):
279+ """The base Aitoff transform."""
272280
273281 def transform_non_affine (self , ll ):
274282 longitude = ll [:, 0 :1 ]
@@ -291,27 +299,11 @@ def transform_non_affine(self, ll):
291299 return np .concatenate ((x .filled (0 ), y .filled (0 )), 1 )
292300 transform_non_affine .__doc__ = Transform .transform_non_affine .__doc__
293301
294- def transform_path_non_affine (self , path ):
295- vertices = path .vertices
296- ipath = path .interpolated (self ._resolution )
297- return Path (self .transform (ipath .vertices ), ipath .codes )
298- transform_path_non_affine .__doc__ = Transform .transform_path_non_affine .__doc__
299-
300302 def inverted (self ):
301303 return AitoffAxes .InvertedAitoffTransform (self ._resolution )
302304 inverted .__doc__ = Transform .inverted .__doc__
303305
304- class InvertedAitoffTransform (Transform ):
305- input_dims = 2
306- output_dims = 2
307- is_separable = False
308-
309- def __init__ (self , resolution ):
310- Transform .__init__ (self )
311- self ._resolution = resolution
312-
313- def __str__ (self ):
314- return "{}({})" .format (type (self ).__name__ , self ._resolution )
306+ class InvertedAitoffTransform (_GeoTransform ):
315307
316308 def transform_non_affine (self , xy ):
317309 # MGDTODO: Math is hard ;(
@@ -335,25 +327,8 @@ def _get_core_transform(self, resolution):
335327class HammerAxes (GeoAxes ):
336328 name = 'hammer'
337329
338- class HammerTransform (Transform ):
339- """
340- The base Hammer transform.
341- """
342- input_dims = 2
343- output_dims = 2
344- is_separable = False
345-
346- def __init__ (self , resolution ):
347- """
348- Create a new Hammer transform. Resolution is the number of steps
349- to interpolate between each input line segment to approximate its
350- path in curved Hammer space.
351- """
352- Transform .__init__ (self )
353- self ._resolution = resolution
354-
355- def __str__ (self ):
356- return "{}({})" .format (type (self ).__name__ , self ._resolution )
330+ class HammerTransform (_GeoTransform ):
331+ """The base Hammer transform."""
357332
358333 def transform_non_affine (self , ll ):
359334 longitude = ll [:, 0 :1 ]
@@ -370,27 +345,11 @@ def transform_non_affine(self, ll):
370345 return np .concatenate ((x , y ), 1 )
371346 transform_non_affine .__doc__ = Transform .transform_non_affine .__doc__
372347
373- def transform_path_non_affine (self , path ):
374- vertices = path .vertices
375- ipath = path .interpolated (self ._resolution )
376- return Path (self .transform (ipath .vertices ), ipath .codes )
377- transform_path_non_affine .__doc__ = Transform .transform_path_non_affine .__doc__
378-
379348 def inverted (self ):
380349 return HammerAxes .InvertedHammerTransform (self ._resolution )
381350 inverted .__doc__ = Transform .inverted .__doc__
382351
383- class InvertedHammerTransform (Transform ):
384- input_dims = 2
385- output_dims = 2
386- is_separable = False
387-
388- def __init__ (self , resolution ):
389- Transform .__init__ (self )
390- self ._resolution = resolution
391-
392- def __str__ (self ):
393- return "{}({})" .format (type (self ).__name__ , self ._resolution )
352+ class InvertedHammerTransform (_GeoTransform ):
394353
395354 def transform_non_affine (self , xy ):
396355 x , y = xy .T
@@ -417,25 +376,8 @@ def _get_core_transform(self, resolution):
417376class MollweideAxes (GeoAxes ):
418377 name = 'mollweide'
419378
420- class MollweideTransform (Transform ):
421- """
422- The base Mollweide transform.
423- """
424- input_dims = 2
425- output_dims = 2
426- is_separable = False
427-
428- def __init__ (self , resolution ):
429- """
430- Create a new Mollweide transform. Resolution is the number of steps
431- to interpolate between each input line segment to approximate its
432- path in curved Mollweide space.
433- """
434- Transform .__init__ (self )
435- self ._resolution = resolution
436-
437- def __str__ (self ):
438- return "{}({})" .format (type (self ).__name__ , self ._resolution )
379+ class MollweideTransform (_GeoTransform ):
380+ """The base Mollweide transform."""
439381
440382 def transform_non_affine (self , ll ):
441383 def d (theta ):
@@ -471,27 +413,11 @@ def d(theta):
471413 return xy
472414 transform_non_affine .__doc__ = Transform .transform_non_affine .__doc__
473415
474- def transform_path_non_affine (self , path ):
475- vertices = path .vertices
476- ipath = path .interpolated (self ._resolution )
477- return Path (self .transform (ipath .vertices ), ipath .codes )
478- transform_path_non_affine .__doc__ = Transform .transform_path_non_affine .__doc__
479-
480416 def inverted (self ):
481417 return MollweideAxes .InvertedMollweideTransform (self ._resolution )
482418 inverted .__doc__ = Transform .inverted .__doc__
483419
484- class InvertedMollweideTransform (Transform ):
485- input_dims = 2
486- output_dims = 2
487- is_separable = False
488-
489- def __init__ (self , resolution ):
490- Transform .__init__ (self )
491- self ._resolution = resolution
492-
493- def __str__ (self ):
494- return "{}({})" .format (type (self ).__name__ , self ._resolution )
420+ class InvertedMollweideTransform (_GeoTransform ):
495421
496422 def transform_non_affine (self , xy ):
497423 x = xy [:, 0 :1 ]
@@ -523,28 +449,19 @@ def _get_core_transform(self, resolution):
523449class LambertAxes (GeoAxes ):
524450 name = 'lambert'
525451
526- class LambertTransform (Transform ):
527- """
528- The base Lambert transform.
529- """
530- input_dims = 2
531- output_dims = 2
532- is_separable = False
452+ class LambertTransform (_GeoTransform ):
453+ """The base Lambert transform."""
533454
534455 def __init__ (self , center_longitude , center_latitude , resolution ):
535456 """
536457 Create a new Lambert transform. Resolution is the number of steps
537458 to interpolate between each input line segment to approximate its
538459 path in curved Lambert space.
539460 """
540- Transform .__init__ (self )
541- self ._resolution = resolution
461+ _GeoTransform .__init__ (self , resolution )
542462 self ._center_longitude = center_longitude
543463 self ._center_latitude = center_latitude
544464
545- def __str__ (self ):
546- return "{}({})" .format (type (self ).__name__ , self ._resolution )
547-
548465 def transform_non_affine (self , ll ):
549466 longitude = ll [:, 0 :1 ]
550467 latitude = ll [:, 1 :2 ]
@@ -568,33 +485,20 @@ def transform_non_affine(self, ll):
568485 return np .concatenate ((x , y ), 1 )
569486 transform_non_affine .__doc__ = Transform .transform_non_affine .__doc__
570487
571- def transform_path_non_affine (self , path ):
572- vertices = path .vertices
573- ipath = path .interpolated (self ._resolution )
574- return Path (self .transform (ipath .vertices ), ipath .codes )
575- transform_path_non_affine .__doc__ = Transform .transform_path_non_affine .__doc__
576-
577488 def inverted (self ):
578489 return LambertAxes .InvertedLambertTransform (
579490 self ._center_longitude ,
580491 self ._center_latitude ,
581492 self ._resolution )
582493 inverted .__doc__ = Transform .inverted .__doc__
583494
584- class InvertedLambertTransform (Transform ):
585- input_dims = 2
586- output_dims = 2
587- is_separable = False
495+ class InvertedLambertTransform (_GeoTransform ):
588496
589497 def __init__ (self , center_longitude , center_latitude , resolution ):
590- Transform .__init__ (self )
591- self ._resolution = resolution
498+ _GeoTransform .__init__ (self , resolution )
592499 self ._center_longitude = center_longitude
593500 self ._center_latitude = center_latitude
594501
595- def __str__ (self ):
596- return "{}({})" .format (type (self ).__name__ , self ._resolution )
597-
598502 def transform_non_affine (self , xy ):
599503 x = xy [:, 0 :1 ]
600504 y = xy [:, 1 :2 ]
0 commit comments