
    G8cC                        d dl Zd dlZd dlmZ d dlmZ d dlmZ	 d dl
mZ d dlmZ d dlmZ d dlmZmZmZmZ d dlmZmZmZ  G d d	e      Z G d
 de      Z G d de      Z G d de      Z G d de      Z G d de      Zy)    N)_api)AxesCircle)Path)	FormatterNullLocatorFixedLocatorNullFormatter)Affine2DBboxTransformTo	Transformc                        e Zd ZdZ G d de      ZdZd Z fdZd Z	d Z
dd	Zd
 Zd ZddZd Zd Zd Zd Zd ZeZd ZeZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z  xZ!S )GeoAxesz2An abstract base class for geographic projections.c                        e Zd ZdZddZddZy)GeoAxes.ThetaFormatterz
        Used to format the theta tick labels.  Converts the native
        unit of radians into degrees and adds a degree symbol.
        c                     || _         y N)	_round_to)selfround_tos     </usr/lib/python3/dist-packages/matplotlib/projections/geo.py__init__zGeoAxes.ThetaFormatter.__init__   s	    %DN    Nc                 ~    t        t        j                  |      | j                  z        | j                  z  }|ddS )Nz0.0f   °)roundnprad2degr   )r   xposdegreess       r   __call__zGeoAxes.ThetaFormatter.__call__   s5    BJJqMDNN:;dnnLGd^?33r   )      ?r   )__name__
__module____qualname____doc__r   r#    r   r   ThetaFormatterr      s    		&	4r   r*   K   c                     t        j                  |       | _        t        j                  |       | _        | j                          y r   )maxisXAxisxaxisYAxisyaxis_update_transScaler   s    r   
_init_axiszGeoAxes._init_axis    s0    [[&
[[&
 	!r   c                    t         |           | j                  d       | j                  d       | j	                  d       | j
                  j                  t                      | j                  j                  t                      | j
                  j                  d       | j                  j                  d       | j                  j                  d       | j                  t        j                  d          t        j                  | t         j"                   t         j"                         t        j$                  | t         j"                   dz  t         j"                  dz         y )	N      r+   noneT)label1Onz	axes.grid       @)superclearset_longitude_gridset_latitude_gridset_longitude_grid_endsr/   set_minor_locatorr	   r1   set_ticks_positionset_tick_paramsgridmplrcParamsr   set_xlimr   piset_ylimr   	__class__s    r   r<   zGeoAxes.clear(   s    #r"$$R(

$$[]3

$$[]3

%%f-

%%f-

""D"1 			#,,{+,dRUUFBEE*dRUUFSL"%%#+6r   c                    | j                  | j                        | _        | j                         | _        t        | j                        | _        | j                  | j                  z   | j                  z   | _        t               j                  d| j                  dz        j                  d| j                         | _        | j                  | j                  z   | _        t               j                  dd      | j                  z   t               j                  dd      z   | _        t               j                  dd      | j                  z   t               j                  dd      z   | _        t               j                  t"        j$                  dz  d      j                  t"        j$                   d      }t               j                  dd      }|| j                  z   | _        || j                  z   || j                  z   | j                  z   z   }|t               j                  dd      z   | _        |t               j                  dd      z   | _        y )	N      r      g?i   )_get_core_transform
RESOLUTIONtransProjection_get_affine_transformtransAffiner   bbox	transAxes	transDatar   scale_longitude_cap	translate_xaxis_pretransform_xaxis_transform_xaxis_text1_transform_xaxis_text2_transformr   rG   _yaxis_transform_yaxis_text1_transform_yaxis_text2_transform)r   yaxis_stretchyaxis_spaceyaxis_text_bases       r   _set_lim_and_transformszGeoAxes._set_lim_and_transforms<   s   #77H557(3
   NN 	 JU1d))A-.Yq4.../ 	 
 $$NN 	 JQ"NNJ  A&' 	#
 JQ"NNJ  B'( 	# !
((A6@@"%%Kj&&q#.NN 	   !^^ 	 J  Q'( 	# J  A&' 	#r   c                    | j                  d      }|j                  t        j                  df      \  }}|j                  dt        j                  dz  f      \  }}t	               j                  d|z  d|z        j                  dd      S )NrL   r   rM         ?)rQ   	transformr   rG   r   rY   r[   )r   ri   xscale_yscales        r   rT   zGeoAxes._get_affine_transformo   sx    ,,Q/	''
3	''BEE!G5	6zU3<v.YsC 	!r   c                 L    t        j                  g d|       | j                  S N)tick1tick2rC   )which)r   check_in_listr]   r   rq   s     r   get_xaxis_transformzGeoAxes.get_xaxis_transformw       5UC$$$r   c                      | j                   ddfS )Nbottomcenter)r^   r   pads     r   get_xaxis_text1_transformz!GeoAxes.get_xaxis_text1_transform{   s    **Hh>>r   c                      | j                   ddfS )Ntoprx   )r_   ry   s     r   get_xaxis_text2_transformz!GeoAxes.get_xaxis_text2_transform~   s    **E8;;r   c                 L    t        j                  g d|       | j                  S rn   )r   rr   r`   rs   s     r   get_yaxis_transformzGeoAxes.get_yaxis_transform   ru   r   c                      | j                   ddfS )Nrx   right)ra   ry   s     r   get_yaxis_text1_transformz!GeoAxes.get_yaxis_text1_transform   s    **Hg==r   c                      | j                   ddfS )Nrx   left)rb   ry   s     r   get_yaxis_text2_transformz!GeoAxes.get_yaxis_text2_transform   s    **Hf<<r   c                     t        dd      S )Nrh   rh   rh   r   r3   s    r   _gen_axes_patchzGeoAxes._gen_axes_patch   s    j#&&r   c                 H    dt         j                  j                  | dd      iS )Ngeor   rh   )mspinesSpinecircular_spiner3   s    r   _gen_axes_spineszGeoAxes._gen_axes_spines   s     w}}33D*cJKKr   c                      |d   dk7  rt         y )Nr   linear)NotImplementedErrorr   argskwargss      r   
set_yscalezGeoAxes.set_yscale   s    7h%% r   c                     t        d      )z-Not supported. Please consider using Cartopy.zaChanging axes limits of a geographic projection is not supported.  Please consider using Cartopy.)	TypeErrorr   s      r   rF   zGeoAxes.set_xlim   s     I J 	Jr   c                     t        j                  ||g      \  }}|dk\  rdnd}|dk\  rdnd}dt        |      |t        |      |fz  S )z1Return a format string formatting the coordinate.        NSEWu   %f°%s, %f°%s)r   r   abs)r   lonlatnsews        r   format_coordzGeoAxes.format_coord   sS    ::sCj)S3JSC3JSC:s8RS2./ 	0r   c                     t        j                  d|z   d|      }| j                  j                  t	        t        j
                  |                   | j                  j                  | j                  |             y)zH
        Set the number of degrees between each longitude grid.
        iL   N)r   aranger/   set_major_locatorr
   deg2radset_major_formatterr*   r   r"   rC   s      r   r=   zGeoAxes.set_longitude_grid   sW    
 yyg6

$$\"**T2B%CD

&&t':':7'CDr   c                     t        j                  d|z   d|      }| j                  j                  t	        t        j
                  |                   | j                  j                  | j                  |             y)zG
        Set the number of degrees between each latitude grid.
        iZ   N)r   r   r1   r   r
   r   r   r*   r   s      r   r>   zGeoAxes.set_latitude_grid   sW    
 yywG4

$$\"**T2B%CD

&&t':':7'CDr   c                     t        j                  |      | _        | j                  j	                         j                  d| j                  dz        j                  d| j                          y)zS
        Set the latitude(s) at which to stop drawing the longitude grids.
        r$   r:   r   N)r   r   rZ   r\   r<   rY   r[   )r   r"   s     r   r?   zGeoAxes.set_longitude_grid_ends   sQ     !jj1  UWU3++c12YsT0001r   c                      y)z+Return the aspect ratio of the data itself.r$   r)   r3   s    r   get_data_ratiozGeoAxes.get_data_ratio   s    r   c                      y)z
        Return whether this axes supports the zoom box button functionality.

        This axes object does not support interactive zoom box.
        Fr)   r3   s    r   can_zoomzGeoAxes.can_zoom        r   c                      y)z
        Return whether this axes supports the pan/zoom button functionality.

        This axes object does not support interactive pan/zoom.
        Fr)   r3   s    r   can_panzGeoAxes.can_pan   r   r   c                      y r   r)   )r   r    ybuttons       r   	start_panzGeoAxes.start_pan       r   c                      y r   r)   r3   s    r   end_panzGeoAxes.end_pan   r   r   c                      y r   r)   )r   r   keyr    r   s        r   drag_panzGeoAxes.drag_pan   r   r   )rC   )"r%   r&   r'   r(   r   r*   rR   r4   r<   rf   rT   rt   r{   r~   r   r   r   r   r   r   
set_xscalerF   rH   r   r=   r>   r?   r   r   r   r   r   r   __classcell__rJ   s   @r   r   r      s    <
4 
4 J"7(1'f!%?<%>='L& JJ
 H0EE2r   r   c                   2     e Zd ZdxZZ fdZd Zd Z xZS )_GeoTransformrM   c                 0    t         |           || _        y)z
        Create a new geographical transform.

        Resolution is the number of steps to interpolate between each input
        line segment to approximate its path in curved space.
        N)r;   r   _resolution)r   
resolutionrJ   s     r   r   z_GeoTransform.__init__   s     	%r   c                 `    dj                  t        |       j                  | j                        S )Nz{}({}))formattyper%   r   r3   s    r   __str__z_GeoTransform.__str__   s#    tDz22D4D4DEEr   c                     |j                  | j                        }t        | j                  |j                        |j
                        S r   )interpolatedr   r   ri   verticescodes)r   pathipaths      r   transform_path_non_affinez'_GeoTransform.transform_path_non_affine   s6    !!$"2"23DNN5>>2EKK@@r   )	r%   r&   r'   
input_dimsoutput_dimsr   r   r   r   r   s   @r   r   r      s      J&FAr   r   c                   T     e Zd ZdZ G d de      Z G d de      Z fdZd Z xZ	S )
AitoffAxesaitoffc                       e Zd ZdZd Zd Zy)AitoffAxes.AitoffTransformzThe base Aitoff transform.c                    |j                   \  }}|dz  }t        j                  |      }t        j                  |t        j                  |      z        }t        j                  |t        j
                  z        }|t        j                  |      z  |z  }t        j                  |      |z  }	t        j                  ||	g      S )Nr:   )Tr   cosarccossincrG   sincolumn_stack)
r   ll	longitudelatitude	half_longcos_latitudealpha
sinc_alphar    r   s
             r   transform_non_affinez/AitoffAxes.AitoffTransform.transform_non_affine   s    "$$$Ix "CI66(+LIIlRVVI->>?E/Jy 11Z?Ax :-A??Aq6**r   c                 @    t         j                  | j                        S r   )r   InvertedAitoffTransformr   r3   s    r   invertedz#AitoffAxes.AitoffTransform.inverted      55d6F6FGGr   Nr%   r&   r'   r(   r   r   r)   r   r   AitoffTransformr      s    (	+	Hr   r   c                       e Zd Zd Zd Zy)"AitoffAxes.InvertedAitoffTransformc                 J    t        j                  |t         j                        S r   )r   	full_likenan)r   xys     r   r   z7AitoffAxes.InvertedAitoffTransform.transform_non_affine  s     <<BFF++r   c                 @    t         j                  | j                        S r   )r   r   r   r3   s    r   r   z+AitoffAxes.InvertedAitoffTransform.inverted      --d.>.>??r   Nr%   r&   r'   r   r   r)   r   r   r   r     s    	,
	@r   r   c                     t         j                  dz  | _        t        |   |i | | j                  ddd       | j                          y Nr:   rh   boxC
adjustableanchorr   rG   rZ   r;   r   
set_aspectr<   r   r   r   rJ   s      r   r   zAitoffAxes.__init__  @     eeck$)&)c:

r   c                 $    | j                  |      S r   )r   r   r   s     r   rQ   zAitoffAxes._get_core_transform#      ##J//r   )
r%   r&   r'   namer   r   r   r   rQ   r   r   s   @r   r   r      s.    DH- H,	@- 	@0r   r   c                   T     e Zd ZdZ G d de      Z G d de      Z fdZd Z xZ	S )
HammerAxeshammerc                       e Zd ZdZd Zd Zy)HammerAxes.HammerTransformzThe base Hammer transform.c                    |j                   \  }}|dz  }t        j                  |      }t        j                  d      }t        j                  d|t        j                  |      z  z         }d|z  |t        j                  |      z  z  |z  }|t        j                  |      z  |z  }	t        j
                  ||	g      S )Nr:   r$   )r   r   r   sqrtr   r   )
r   r   r   r   r   r   sqrt2r   r    r   s
             r   r   z/HammerAxes.HammerTransform.transform_non_affine-  s    "$$$Ix!CI66(+LGGCLEGGC,	1B"BBCEuy0A!ABUJA))U2A??Aq6**r   c                 @    t         j                  | j                        S r   )r  InvertedHammerTransformr   r3   s    r   r   z#HammerAxes.HammerTransform.inverted8  r   r   Nr   r)   r   r   HammerTransformr  *  s    (		+	Hr   r  c                       e Zd Zd Zd Zy)"HammerAxes.InvertedHammerTransformc                     |j                   \  }}t        j                  d|dz  dz  z
  |dz  dz  z
        }dt        j                  ||z  dd|dz  z  dz
  z  z        z  }t        j                  ||z        }t        j
                  ||g      S )NrL   rN   rM   )r   r   r  arctanarcsinr   )r   r   r    r   zr   r   s          r   r   z7HammerAxes.InvertedHammerTransform.transform_non_affine>  s    44DAqQUqL(AEa<78ABIIq1ua!q&j1n1E&FGGIyy1~H??Ix#899r   c                 @    t         j                  | j                        S r   )r  r  r   r3   s    r   r   z+HammerAxes.InvertedHammerTransform.invertedF  r   r   Nr   r)   r   r   r  r  <  s    	:	@r   r  c                     t         j                  dz  | _        t        |   |i | | j                  ddd       | j                          y r   r   r  s      r   r   zHammerAxes.__init__J  r  r   c                 $    | j                  |      S r   )r  r  s     r   rQ   zHammerAxes._get_core_transformP  r  r   )
r%   r&   r'   r  r   r  r  r   rQ   r   r   s   @r   r  r  '  s.    DH- H$@- @0r   r  c                   T     e Zd ZdZ G d de      Z G d de      Z fdZd Z xZ	S )MollweideAxes	mollweidec                       e Zd ZdZd Zd Zy) MollweideAxes.MollweideTransformzThe base Mollweide transform.c                    fd}|j                   \  }}t        j                  dz  t        j                  |      z
  }|dk  }| }t        j                  |j
                  t              }|j                         rt        j                  t        j                  ||         z  d||   z  }	 ||	      \  }
}t        j                  |      r1|	|xx   |
|   z  cc<    ||	      \  }
}t        j                  |      r1|	dz  ||<   |j                         rV||   }ddt        j                  z  |dz  z  dz  z  }t        j                  dz  |z
  t        j                  ||         z  ||<   t        j                  |j
                  t              }dt        j                  d      z  t        j                  z  |z  t        j                  |      z  |d d d	f<   t        j                  d      t        j                  |      z  |d d d
f<   |S )Nc                     | t        j                  |       z   z
   dt        j                  |       z   z  }|t        j                  |      dkD  fS )NrL   gMbP?)r   r   r   r   )thetadeltapi_sin_ls     r   dz@MollweideAxes.MollweideTransform.transform_non_affine.<locals>.d\  sJ     266%=08;<u-/bffUme333r   rM   gʡE?)dtyper:   rh      gUUUUUU?r   rL   )r   r   rG   r   emptyshapefloatanyr   signr  r   )r   r   r%  r   r   clatihighilowauxr"  r#  large_deltaer   r$  s                 @r   r   z5MollweideAxes.MollweideTransform.transform_non_affineZ  s   4
 #%$$Ix557RVVH--D5LE6D((8>>7Cxxz55266(4.#99htn,%&uX"{ff[)+&%*<<&)*5&E; ff[) "AID	yy{K1ruu9q!t+77 eeAgkRWWXe_-EEE
"((%0Bbggcl*RUU2i?"&&+MBq!tHwws|bffSk1Bq!tHIr   c                 @    t         j                  | j                        S r   )r  InvertedMollweideTransformr   r3   s    r   r   z)MollweideAxes.MollweideTransform.inverted|  s     ;;D<L<LMMr   Nr   r)   r   r   MollweideTransformr  W  s    + 	D	Nr   r5  c                       e Zd Zd Zd Zy)(MollweideAxes.InvertedMollweideTransformc                    |j                   \  }}t        j                  |t        j                  d      z        }t        j                  dt        j                  d      z  z  |z  t        j
                  |      z  }t        j                  d|z  t        j                  d|z        z   t        j                  z        }t        j                  ||g      S )NrM   )r   r   r  r  rG   r   r   r   )r   r   r    r   r"  r   r   s          r   r   z=MollweideAxes.InvertedMollweideTransform.transform_non_affine  s    44DAq IIa"''!*n-E!bggaj.1Q6FIyy!e)bffQY.?"?255!HIH??Ix#899r   c                 @    t         j                  | j                        S r   )r  r5  r   r3   s    r   r   z1MollweideAxes.InvertedMollweideTransform.inverted  s     33D4D4DEEr   Nr   r)   r   r   r4  r7    s    	:	Fr   r4  c                     t         j                  dz  | _        t        |   |i | | j                  ddd       | j                          y r   r   r  s      r   r   zMollweideAxes.__init__  r  r   c                 $    | j                  |      S r   )r5  r  s     r   rQ   z!MollweideAxes._get_core_transform  s    &&z22r   )
r%   r&   r'   r  r   r5  r4  r   rQ   r   r   s   @r   r  r  T  s/    D'N] 'NRF] F 3r   r  c                   l     e Zd ZdZ G d de      Z G d de      Zddd fd
Z fd	Zd
 Z	d Z
 xZS )LambertAxeslambertc                   "    e Zd ZdZd Zd Zd Zy)LambertAxes.LambertTransformzThe base Lambert transform.c                 L    t         j                  | |       || _        || _        y)z
            Create a new Lambert transform.  Resolution is the number of steps
            to interpolate between each input line segment to approximate its
            path in curved Lambert space.
            Nr   r   _center_longitude_center_latituder   center_longitudecenter_latituder   s       r   r   z%LambertAxes.LambertTransform.__init__  s$     ""44%5D"$3D!r   c                 p   |j                   \  }}| j                  }| j                  }t        j                  |      }t        j
                  |      }||z
  }t        j                  |      }	t        j                  dt        j
                  |      |z  z   t        j                  |      |z  |	z  z   d      }
t        j                  d|
z        }||z  t        j
                  |      z  }|t        j                  |      |z  t        j
                  |      |z  |	z  z
  z  }t        j                  ||g      S )NrL   gV瞯<rM   )	r   rC  rD  r   r   r   maximumr  r   )r   r   r   r   clongr-  cos_latsin_lat	diff_longcos_diff_longinner_kkr    r   s                 r   r   z1LambertAxes.LambertTransform.transform_non_affine  s   "$$$Ix**E((DffX&GffX&G!E)IFF9-MjjBFF4L((266$<+?+MMG G$AGBFF9--ARVVD\')BFF4L,@,NNOA??Aq6**r   c                 l    t         j                  | j                  | j                  | j                        S r   )r=  InvertedLambertTransformrC  rD  r   r3   s    r   r   z%LambertAxes.LambertTransform.inverted  s0    77&&%%  " "r   N)r%   r&   r'   r(   r   r   r   r)   r   r   LambertTransformr@    s    )	4	+&	"r   rS  c                       e Zd Zd Zd Zd Zy)$LambertAxes.InvertedLambertTransformc                 L    t         j                  | |       || _        || _        y r   rB  rE  s       r   r   z-LambertAxes.InvertedLambertTransform.__init__  s"    ""44%5D"$3D!r   c           	         |j                   \  }}| j                  }| j                  }t        j                  t        j
                  ||      d      }dt        j                  d|z        z  }t        j                  |      }t        j                  |      }	t        j                  |	t        j                  |      z  ||z  t        j                  |      z  |z  z         }
|t        j                  ||z  |t        j                  |      z  |	z  |t        j                  |      z  |z  z
  z        z   }t        j                  ||
g      S )Ng&.>rM   rh   )r   rC  rD  r   rI  hypotr  r   r   r  r   )r   r   r    r   rJ  r-  pcsin_ccos_cr   r   s               r   r   z9LambertAxes.InvertedLambertTransform.transform_non_affine  s   44DAq**E((D

288Aq>40ABIIcAg&&AFF1IEFF1IEyyrvvd|!3#$U7266$<#71"<"> ?H		5Qrvvd|^E1AbffTlN54HHI!K KI ??Ix#899r   c                 l    t         j                  | j                  | j                  | j                        S r   )r=  rS  rC  rD  r   r3   s    r   r   z-LambertAxes.InvertedLambertTransform.inverted  s0    //&&%%  " "r   N)r%   r&   r'   r   r   r   r)   r   r   rR  rU    s    	4
	:"	"r   rR  r   )rF  rG  c                    t         j                  dz  | _        || _        || _        t        |   |i | | j                  ddd       | j                          y )NrM   equalr   r   r   )	r   rG   rZ   rC  rD  r;   r   r   r<   )r   rF  rG  r   r   rJ   s        r   r   zLambertAxes.__init__  sP     eeai!1 /$)&)E#>

r   c                 h    t         |           | j                  j                  t	                      y r   )r;   r<   r1   r   r   rI   s    r   r<   zLambertAxes.clear  s     

&&}7r   c                 P    | j                  | j                  | j                  |      S r   )rS  rC  rD  r  s     r   rQ   zLambertAxes._get_core_transform  s*    $$""!! 	r   c                 T    t               j                  d      j                  dd      S )Ng      ?rh   )r   rY   r[   r3   s    r   rT   z!LambertAxes._get_affine_transform  s!    zU4[YsC 	!r   )r%   r&   r'   r  r   rS  rR  r   r<   rQ   rT   r   r   s   @r   r=  r=    s<    D%"= %"N"= "> 01! 8
!r   r=  ) numpyr   
matplotlibrD   r   matplotlib.axesr   matplotlib.axisaxisr-   matplotlib.patchesr   matplotlib.pathr   matplotlib.spinesspinesr   matplotlib.tickerr   r	   r
   r   matplotlib.transformsr   r   r   r   r   r   r  r  r=  r)   r   r   <module>rn     s          %   #9 9 F FPd PfAI A.+0 +0\*0 *0ZC3G C3L_!' _!r   