17
17
import matplotlib .spines as mspines
18
18
import matplotlib .axis as maxis
19
19
from matplotlib .ticker import Formatter , Locator , NullLocator , FixedLocator , NullFormatter
20
- from matplotlib .transforms import Affine2D , Affine2DBase , Bbox , \
21
- BboxTransformTo , IdentityTransform , Transform , TransformWrapper
20
+ from matplotlib .transforms import Affine2D , BboxTransformTo , Transform
21
+
22
22
23
23
class GeoAxes (Axes ):
24
- """
25
- An abstract base class for geographic projections
26
- """
24
+ """An abstract base class for geographic projections."""
27
25
class ThetaFormatter (Formatter ):
28
26
"""
29
27
Used to format the theta tick labels. Converts the native
@@ -248,25 +246,37 @@ def drag_pan(self, button, key, x, y):
248
246
pass
249
247
250
248
251
- class AitoffAxes (GeoAxes ):
252
- name = 'aitoff'
249
+ class _GeoTransform (Transform ):
250
+ # Factoring out some common functionality.
251
+ input_dims = 2
252
+ output_dims = 2
253
+ is_separable = False
253
254
254
- class AitoffTransform ( Transform ):
255
+ def __init__ ( self , resolution ):
255
256
"""
256
- 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.
257
261
"""
258
- input_dims = 2
259
- output_dims = 2
260
- is_separable = False
262
+ Transform .__init__ (self )
263
+ self ._resolution = resolution
264
+
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__
261
273
262
- def __init__ (self , resolution ):
263
- """
264
- Create a new Aitoff transform. Resolution is the number of steps
265
- to interpolate between each input line segment to approximate its
266
- path in curved Aitoff space.
267
- """
268
- Transform .__init__ (self )
269
- self ._resolution = resolution
274
+
275
+ class AitoffAxes (GeoAxes ):
276
+ name = 'aitoff'
277
+
278
+ class AitoffTransform (_GeoTransform ):
279
+ """The base Aitoff transform."""
270
280
271
281
def transform_non_affine (self , ll ):
272
282
longitude = ll [:, 0 ]
@@ -288,24 +298,11 @@ def transform_non_affine(self, ll):
288
298
return xy
289
299
transform_non_affine .__doc__ = Transform .transform_non_affine .__doc__
290
300
291
- def transform_path_non_affine (self , path ):
292
- vertices = path .vertices
293
- ipath = path .interpolated (self ._resolution )
294
- return Path (self .transform (ipath .vertices ), ipath .codes )
295
- transform_path_non_affine .__doc__ = Transform .transform_path_non_affine .__doc__
296
-
297
301
def inverted (self ):
298
302
return AitoffAxes .InvertedAitoffTransform (self ._resolution )
299
303
inverted .__doc__ = Transform .inverted .__doc__
300
304
301
- class InvertedAitoffTransform (Transform ):
302
- input_dims = 2
303
- output_dims = 2
304
- is_separable = False
305
-
306
- def __init__ (self , resolution ):
307
- Transform .__init__ (self )
308
- self ._resolution = resolution
305
+ class InvertedAitoffTransform (_GeoTransform ):
309
306
310
307
def transform_non_affine (self , xy ):
311
308
# MGDTODO: Math is hard ;(
@@ -329,22 +326,8 @@ def _get_core_transform(self, resolution):
329
326
class HammerAxes (GeoAxes ):
330
327
name = 'hammer'
331
328
332
- class HammerTransform (Transform ):
333
- """
334
- The base Hammer transform.
335
- """
336
- input_dims = 2
337
- output_dims = 2
338
- is_separable = False
339
-
340
- def __init__ (self , resolution ):
341
- """
342
- Create a new Hammer transform. Resolution is the number of steps
343
- to interpolate between each input line segment to approximate its
344
- path in curved Hammer space.
345
- """
346
- Transform .__init__ (self )
347
- self ._resolution = resolution
329
+ class HammerTransform (_GeoTransform ):
330
+ """The base Hammer transform."""
348
331
349
332
def transform_non_affine (self , ll ):
350
333
longitude = ll [:, 0 :1 ]
@@ -361,24 +344,11 @@ def transform_non_affine(self, ll):
361
344
return np .concatenate ((x , y ), 1 )
362
345
transform_non_affine .__doc__ = Transform .transform_non_affine .__doc__
363
346
364
- def transform_path_non_affine (self , path ):
365
- vertices = path .vertices
366
- ipath = path .interpolated (self ._resolution )
367
- return Path (self .transform (ipath .vertices ), ipath .codes )
368
- transform_path_non_affine .__doc__ = Transform .transform_path_non_affine .__doc__
369
-
370
347
def inverted (self ):
371
348
return HammerAxes .InvertedHammerTransform (self ._resolution )
372
349
inverted .__doc__ = Transform .inverted .__doc__
373
350
374
- class InvertedHammerTransform (Transform ):
375
- input_dims = 2
376
- output_dims = 2
377
- is_separable = False
378
-
379
- def __init__ (self , resolution ):
380
- Transform .__init__ (self )
381
- self ._resolution = resolution
351
+ class InvertedHammerTransform (_GeoTransform ):
382
352
383
353
def transform_non_affine (self , xy ):
384
354
x , y = xy .T
@@ -405,22 +375,8 @@ def _get_core_transform(self, resolution):
405
375
class MollweideAxes (GeoAxes ):
406
376
name = 'mollweide'
407
377
408
- class MollweideTransform (Transform ):
409
- """
410
- The base Mollweide transform.
411
- """
412
- input_dims = 2
413
- output_dims = 2
414
- is_separable = False
415
-
416
- def __init__ (self , resolution ):
417
- """
418
- Create a new Mollweide transform. Resolution is the number of steps
419
- to interpolate between each input line segment to approximate its
420
- path in curved Mollweide space.
421
- """
422
- Transform .__init__ (self )
423
- self ._resolution = resolution
378
+ class MollweideTransform (_GeoTransform ):
379
+ """The base Mollweide transform."""
424
380
425
381
def transform_non_affine (self , ll ):
426
382
def d (theta ):
@@ -456,24 +412,11 @@ def d(theta):
456
412
return xy
457
413
transform_non_affine .__doc__ = Transform .transform_non_affine .__doc__
458
414
459
- def transform_path_non_affine (self , path ):
460
- vertices = path .vertices
461
- ipath = path .interpolated (self ._resolution )
462
- return Path (self .transform (ipath .vertices ), ipath .codes )
463
- transform_path_non_affine .__doc__ = Transform .transform_path_non_affine .__doc__
464
-
465
415
def inverted (self ):
466
416
return MollweideAxes .InvertedMollweideTransform (self ._resolution )
467
417
inverted .__doc__ = Transform .inverted .__doc__
468
418
469
- class InvertedMollweideTransform (Transform ):
470
- input_dims = 2
471
- output_dims = 2
472
- is_separable = False
473
-
474
- def __init__ (self , resolution ):
475
- Transform .__init__ (self )
476
- self ._resolution = resolution
419
+ class InvertedMollweideTransform (_GeoTransform ):
477
420
478
421
def transform_non_affine (self , xy ):
479
422
x = xy [:, 0 :1 ]
@@ -505,22 +448,16 @@ def _get_core_transform(self, resolution):
505
448
class LambertAxes (GeoAxes ):
506
449
name = 'lambert'
507
450
508
- class LambertTransform (Transform ):
509
- """
510
- The base Lambert transform.
511
- """
512
- input_dims = 2
513
- output_dims = 2
514
- is_separable = False
451
+ class LambertTransform (_GeoTransform ):
452
+ """The base Lambert transform."""
515
453
516
454
def __init__ (self , center_longitude , center_latitude , resolution ):
517
455
"""
518
456
Create a new Lambert transform. Resolution is the number of steps
519
457
to interpolate between each input line segment to approximate its
520
458
path in curved Lambert space.
521
459
"""
522
- Transform .__init__ (self )
523
- self ._resolution = resolution
460
+ _GeoTransform .__init__ (self , resolution )
524
461
self ._center_longitude = center_longitude
525
462
self ._center_latitude = center_latitude
526
463
@@ -547,27 +484,17 @@ def transform_non_affine(self, ll):
547
484
return np .concatenate ((x , y ), 1 )
548
485
transform_non_affine .__doc__ = Transform .transform_non_affine .__doc__
549
486
550
- def transform_path_non_affine (self , path ):
551
- vertices = path .vertices
552
- ipath = path .interpolated (self ._resolution )
553
- return Path (self .transform (ipath .vertices ), ipath .codes )
554
- transform_path_non_affine .__doc__ = Transform .transform_path_non_affine .__doc__
555
-
556
487
def inverted (self ):
557
488
return LambertAxes .InvertedLambertTransform (
558
489
self ._center_longitude ,
559
490
self ._center_latitude ,
560
491
self ._resolution )
561
492
inverted .__doc__ = Transform .inverted .__doc__
562
493
563
- class InvertedLambertTransform (Transform ):
564
- input_dims = 2
565
- output_dims = 2
566
- is_separable = False
494
+ class InvertedLambertTransform (_GeoTransform ):
567
495
568
496
def __init__ (self , center_longitude , center_latitude , resolution ):
569
- Transform .__init__ (self )
570
- self ._resolution = resolution
497
+ _GeoTransform .__init__ (self , resolution )
571
498
self ._center_longitude = center_longitude
572
499
self ._center_latitude = center_latitude
573
500
0 commit comments