
    P/PhD                     2   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dS )    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e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dS )GeoAxes.ThetaFormatterz
        Used to format the theta tick labels.  Converts the native
        unit of radians into degrees and adds a degree symbol.
              ?c                     || _         d S N)	_round_to)selfround_tos     Z/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/matplotlib/projections/geo.py__init__zGeoAxes.ThetaFormatter.__init__   s    %DNNN    Nc                 p    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__   s7    BJqMMDN:;;dnLG33333r   )r   r   )__name__
__module____qualname____doc__r   r$    r   r   ThetaFormatterr      sF        	 		& 	& 	& 	&	4 	4 	4 	4 	4 	4r   r*   K   c                     t          j        | d          | _        t          j        | d          | _        | j        d                             | j                   d S )NF)cleargeo)maxisXAxisxaxisYAxisyaxisspinesregister_axisr   s    r   
_init_axiszGeoAxes._init_axis    sQ    [U333
[U333
E((44444r   c                    t                                                       |                     d           |                     d           |                     d           | j                            t                                 | j                            t                                 | j        	                    d           | j        	                    d           | j        
                    d           |                     t          j        d                    t          j        | t           j         t           j                   t          j        | t           j         dz  t           j        dz             d S )	N      r+   noneT)label1Onz	axes.grid       @)superr-   set_longitude_gridset_latitude_gridset_longitude_grid_endsr1   set_minor_locatorr	   r3   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3
$$[]]333
%%f---
%%f---
""D"111 			#,{+,,,dRUFBE***dRUFSL"%#+66666r   c                    |                      | j                  | _        |                                 | _        t          | j                  | _        | j        | j        z   | j        z   | _        t                      
                    d| j        dz                                d| j                   | _        | j        | j        z   | _        t                      
                    dd          | j        z   t                                          dd          z   | _        t                      
                    dd          | j        z   t                                          dd          z   | _        t                      
                    t"          j        dz  d                              t"          j         d          }t                      
                    dd          }|| j        z   | _        || j        z   || j        z   | j        z   z   }|t                                          dd          z   | _        |t                                          dd          z   | _        d S )	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   rI   _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_transforms9   s5   #77HH5577(33
  N 	 JJU1d)A-..Yq4..// 	 
 $N 	 JJQ""NJJ  A&&' 	#
 JJQ""NJJ  B''( 	# !

((A66@@"%KKjj&&q#..N 	  !^ 	 JJ  Q''( 	# JJ  A&&' 	###r   c                 :   |                      d          }|                    t          j        df          \  }}|                    dt          j        dz  f          \  }}t	                                          d|z  d|z                                dd          S )NrN   r   rO         ?)rS   	transformr   rI   r   r[   r]   )r   rk   xscale_yscales        r   rV   zGeoAxes._get_affine_transforml   s    ,,Q//	''
33	''BE!G55	6zzU3<v..YsC  	!r   rE   c                 @    t          j        g d|           | j        S N)tick1tick2rE   )which)r   check_in_listr_   r   rs   s     r   get_xaxis_transformzGeoAxes.get_xaxis_transformt   (    555UCCCC$$r   c                     | j         ddfS )Nbottomcenter)r`   r   pads     r   get_xaxis_text1_transformz!GeoAxes.get_xaxis_text1_transformx   s    *Hh>>r   c                     | j         ddfS )Ntoprz   )ra   r{   s     r   get_xaxis_text2_transformz!GeoAxes.get_xaxis_text2_transform{   s    *E8;;r   c                 @    t          j        g d|           | j        S rp   )r   rt   rb   ru   s     r   get_yaxis_transformzGeoAxes.get_yaxis_transform~   rw   r   c                     | j         ddfS )Nrz   right)rc   r{   s     r   get_yaxis_text1_transformz!GeoAxes.get_yaxis_text1_transform   s    *Hg==r   c                     | j         ddfS )Nrz   left)rd   r{   s     r   get_yaxis_text2_transformz!GeoAxes.get_yaxis_text2_transform   s    *Hf<<r   c                 "    t          dd          S )Nrj   rj   rj   r   r6   s    r   _gen_axes_patchzGeoAxes._gen_axes_patch   s    j#&&&r   c                 H    dt           j                            | dd          iS )Nr.   r   rj   )mspinesSpinecircular_spiner6   s    r   _gen_axes_spineszGeoAxes._gen_axes_spines   s!    w}33D*cJJKKr   c                 ,    |d         dk    rt           d S )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   rH   zGeoAxes.set_xlim        I J J 	Jr   c                      t          d          r   r   r6   s    r   invert_xaxiszGeoAxes.invert_xaxis   r   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   s`    :sCj))S3JJSSC3JJSSC:s88RS2./ 	0r   c                    t          j        d|z   d|          }| j                            t	          t          j        |                               | j                            |                     |                     dS )zH
        Set the number of degrees between each longitude grid.
        iL   N)r   aranger1   set_major_locatorr
   deg2radset_major_formatterr*   r   r#   rE   s      r   r?   zGeoAxes.set_longitude_grid   sm    
 yg66
$$\"*T2B2B%C%CDDD
&&t':':7'C'CDDDDDr   c                    t          j        d|z   d|          }| j                            t	          t          j        |                               | j                            |                     |                     dS )zG
        Set the number of degrees between each latitude grid.
        iZ   N)r   r   r3   r   r
   r   r   r*   r   s      r   r@   zGeoAxes.set_latitude_grid   sm    
 ywG44
$$\"*T2B2B%C%CDDD
&&t':':7'C'CDDDDDr   c                     t          j        |          | _        | j                                                            d| j        dz                                d| j                    dS )zS
        Set the latitude(s) at which to stop drawing the longitude grids.
        r   r=   r   N)r   r   r\   r^   r-   r[   r]   )r   r#   s     r   rA   zGeoAxes.set_longitude_grid_ends   sZ     !j11 UWWU3+c122YsT0011111r   c                     dS )z+Return the aspect ratio of the data itself.r   r)   r6   s    r   get_data_ratiozGeoAxes.get_data_ratio   s    sr   c                     dS )z
        Return whether this Axes supports the zoom box button functionality.

        This Axes object does not support interactive zoom box.
        Fr)   r6   s    r   can_zoomzGeoAxes.can_zoom   	     ur   c                     dS )z
        Return whether this Axes supports the pan/zoom button functionality.

        This Axes object does not support interactive pan/zoom.
        Fr)   r6   s    r   can_panzGeoAxes.can_pan   r   r   c                     d S r   r)   )r   r!   ybuttons       r   	start_panzGeoAxes.start_pan       r   c                     d S r   r)   r6   s    r   end_panzGeoAxes.end_pan   r   r   c                     d S r   r)   )r   r   keyr!   r   s        r   drag_panzGeoAxes.drag_pan   r   r   )rE   )&r%   r&   r'   r(   r   r*   rT   r7   r-   rh   rV   rv   r}   r   r   r   r   r   r   r   
set_xscalerH   rJ   
set_xbound
set_yboundr   invert_yaxisr   r?   r@   rA   r   r   r   r   r   r   __classcell__rL   s   @r   r   r      s       <<
4 
4 
4 
4 
4 
4 
4 
4 J5 5 5
7 7 7 7 7(1' 1' 1'f! ! !% % % %? ? ?< < <% % % %> > >= = =' ' 'L L L& & & JJ J J
 HJJJ J J
  L0 0 0E E EE E E2 2 2                r   r   c                   2     e Zd ZdxZZ fdZd Zd Z xZS )_GeoTransformrO   c                 V    t                                                       || _        dS )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   
resolutionrL   s     r   r   z_GeoTransform.__init__   s)     	%r   c                 @    t          |           j         d| j         dS )N())typer%   r   r6   s    r   __str__z_GeoTransform.__str__   s%    t**%;;(8;;;;r   c                     |                     | j                  }t          |                     |j                  |j                  S r   )interpolatedr   r   rk   verticescodes)r   pathipaths      r   transform_path_non_affinez'_GeoTransform.transform_path_non_affine   s8    !!$"233DNN5>22EK@@@r   )	r%   r&   r'   
input_dimsoutput_dimsr   r   r   r   r   s   @r   r   r      sg          J& & & & &< < <A A A A A A Ar   r   c                   `     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dS )AitoffAxes.AitoffTransformzThe base Aitoff transform.c                 j   |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sincrI   sincolumn_stack)
r   values	longitudelatitude	half_longcos_latitudealpha
sinc_alphar!   r   s
             r   transform_non_affinez/AitoffAxes.AitoffTransform.transform_non_affine  s    "((Ix "CI6(++LIlRVI->->>??E//Jy 1 11Z?Ax  :-A?Aq6***r   c                 @    t                               | j                  S r   )r   InvertedAitoffTransformr   r6   s    r   invertedz#AitoffAxes.AitoffTransform.inverted      55d6FGGGr   Nr%   r&   r'   r(   r   r   r)   r   r   AitoffTransformr     s=        ((	+ 	+ 	+	H 	H 	H 	H 	Hr   r   c                       e Zd Zd Zd ZdS )"AitoffAxes.InvertedAitoffTransformc                 @    t          j        |t           j                  S r   )r   	full_likenan)r   r   s     r   r   z7AitoffAxes.InvertedAitoffTransform.transform_non_affine  s     <///r   c                 @    t                               | j                  S r   )r   r   r   r6   s    r   r   z+AitoffAxes.InvertedAitoffTransform.inverted      --d.>???r   Nr%   r&   r'   r   r   r)   r   r   r   r     s7        	0 	0 	0
	@ 	@ 	@ 	@ 	@r   r   c                     t           j        dz  | _         t                      j        |i | |                     ddd           |                                  d S Nr=   rj   boxC
adjustableanchorr   rI   r\   r>   r   
set_aspectr-   r   r   r   rL   s      r   r   zAitoffAxes.__init__#  V     eck$)&)))c:::

r   c                 ,    |                      |          S r   )r   r   r   s     r   rS   zAitoffAxes._get_core_transform)      ##J///r   )
r%   r&   r'   namer   r   r   r   rS   r   r   s   @r   r   r      s        DH H H H H- H H H,	@ 	@ 	@ 	@ 	@- 	@ 	@ 	@    0 0 0 0 0 0 0r   r   c                   `     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dS )HammerAxes.HammerTransformzThe base Hammer transform.c                 h   |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_affine3  s    "((Ix!CI6(++LGCLLEGC,	1B1B"BBCCEuy0A0A!ABUJA)))U2A?Aq6***r   c                 @    t                               | j                  S r   )r  InvertedHammerTransformr   r6   s    r   r   z#HammerAxes.HammerTransform.inverted>  r   r   Nr   r)   r   r   HammerTransformr  0  s=        ((		+ 		+ 		+	H 	H 	H 	H 	Hr   r  c                       e Zd Zd Zd ZdS )"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 )NrN   rP   rO   )r   r   r  arctanarcsinr   )r   r   r!   r   zr   r   s          r   r   z7HammerAxes.InvertedHammerTransform.transform_non_affineD  s    8DAqQUqL(AEa<788ABIq1ua!q&j1n1E&FGGGIy1~~H?Ix#8999r   c                 @    t                               | j                  S r   )r  r  r   r6   s    r   r   z+HammerAxes.InvertedHammerTransform.invertedL  r   r   Nr   r)   r   r   r  r  B  s7        	: 	: 	:	@ 	@ 	@ 	@ 	@r   r  c                     t           j        dz  | _         t                      j        |i | |                     ddd           |                                  d S r  r  r
  s      r   r   zHammerAxes.__init__P  r  r   c                 ,    |                      |          S r   )r  r  s     r   rS   zHammerAxes._get_core_transformV  r  r   )
r%   r&   r'   r  r   r  r  r   rS   r   r   s   @r   r  r  -  s        DH H H H H- H H H$@ @ @ @ @- @ @ @    0 0 0 0 0 0 0r   r  c                   `     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dS ) MollweideAxes.MollweideTransformzThe base Mollweide transform.c                    fd}|j         \  }}t          j        dz  t          j        |          z
  }|dk     }| }t          j        |j        t                    }|                                rt          j        t          j        ||                   z  d||         z  }	 ||	          \  }
}t          j        |          r8|	|xx         |
|         z  cc<    ||	          \  }
}t          j        |          8|	dz  ||<   |                                rS||         }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k    fS )NrN   gMbP?)r   r   r   r   )thetadeltapi_sin_ls     r   dz@MollweideAxes.MollweideTransform.transform_non_affine.<locals>.db  sJ     26%==08;<u-/bfUmme333r   rO   gʡE?)dtyper=   rj      gUUUUUU?r   rN   )r   r   rI   r   emptyshapefloatanyr   signr  r   )r   r   r.  r   r   clatihighilowauxr+  r,  large_deltaexyr-  s                 @r   r   z5MollweideAxes.MollweideTransform.transform_non_affine`  s   4 4 4 4 4
 #)(Ix57RVH---D5LE6D(8>777Cxxzz &526(4.#9#99htn,%&QuXX"{f[)) 2+&&&%*<<&&&)*5&E; f[)) 2 "AID	yy{{ FK1ru9q!t+77 eAgkRWXe_-E-EEE
&,e444Bbgcll*RU2i?"&++MBqqq!tHws||bfSkk1Bqqq!tHIr   c                 @    t                               | j                  S r   )r%  InvertedMollweideTransformr   r6   s    r   r   z)MollweideAxes.MollweideTransform.inverted  s     ;;D<LMMMr   Nr   r)   r   r   MollweideTransformr(  ]  s>        ++ 	  	  	D	N 	N 	N 	N 	Nr   r?  c                       e Zd Zd Zd ZdS )(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 )NrO   )r   r   r  r  rI   r   r   r   )r   r   r!   r   r+  r   r   s          r   r   z=MollweideAxes.InvertedMollweideTransform.transform_non_affine  s    8DAq Ia"'!**n--E!bgajj.1Q6FIy!e)bfQY.?.?"?25!HIIH?Ix#8999r   c                 @    t                               | j                  S r   )r%  r?  r   r6   s    r   r   z1MollweideAxes.InvertedMollweideTransform.inverted  s     33D4DEEEr   Nr   r)   r   r   r>  rA    s7        	: 	: 	:	F 	F 	F 	F 	Fr   r>  c                     t           j        dz  | _         t                      j        |i | |                     ddd           |                                  d S r  r  r
  s      r   r   zMollweideAxes.__init__  r  r   c                 ,    |                      |          S r   )r?  r  s     r   rS   z!MollweideAxes._get_core_transform  s    &&z222r   )
r%   r&   r'   r  r   r?  r>  r   rS   r   r   s   @r   r%  r%  Z  s        D'N 'N 'N 'N 'N] 'N 'N 'NRF F F F F] F F F     3 3 3 3 3 3 3r   r%  c                   x     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dS )LambertAxes.LambertTransformzThe base Lambert transform.c                 X    t                               | |           || _        || _        dS )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__  s0     ""4444%5D"$3D!!!r   c                 <   |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 )NrN   gV瞯<rO   )	r   rM  rN  r   r   r   maximumr  r   )r   r   r   r   clongr6  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fX&&GfX&&G!E)IF9--MjBF4LL((26$<<+?+MM G G$$AGBF9---ARVD\\')BF4LL,@,NNOA?Aq6***r   c                 X    t                               | j        | j        | j                  S r   )rG  InvertedLambertTransformrM  rN  r   r6   s    r   r   z%LambertAxes.LambertTransform.inverted  s,    77&% " " "r   N)r%   r&   r'   r(   r   r   r   r)   r   r   LambertTransformrJ    sG        ))	4 	4 	4	+ 	+ 	+&	" 	" 	" 	" 	"r   r]  c                        e Zd Zd Zd Zd ZdS )$LambertAxes.InvertedLambertTransformc                 X    t                               | |           || _        || _        d S r   rL  rO  s       r   r   z-LambertAxes.InvertedLambertTransform.__init__  s.    ""44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&.>rO   rj   )r   rM  rN  r   rS  hypotr  r   r   r  r   )r   r   r!   r   rT  r6  pcsin_ccos_cr   r   s               r   r   z9LambertAxes.InvertedLambertTransform.transform_non_affine  s   8DAq*E(D
28Aq>>400ABIcAg&&&AF1IIEF1IIEyrvd||!3#$U726$<<#71"<"> ? ?H	5Qrvd||^E1AbfTllN54HHI!K !K KI ?Ix#8999r   c                 X    t                               | j        | j        | j                  S r   )rG  r]  rM  rN  r   r6   s    r   r   z-LambertAxes.InvertedLambertTransform.inverted  s,    //&% " " "r   N)r%   r&   r'   r   r   r   r)   r   r   r\  r_    sA        	4 	4 	4
	: 	: 	:"	" 	" 	" 	" 	"r   r\  r   )rP  rQ  c                    t           j        dz  | _        || _        || _         t                      j        |i | |                     ddd           |                                  d S )NrO   equalr  r  r  )	r   rI   r\   rM  rN  r>   r   r	  r-   )r   rP  rQ  r   r   rL   s        r   r   zLambertAxes.__init__  sf     eai!1 /$)&)))E#>>>

r   c                     t                                                       | j                            t	                                 d S r   )r>   r-   r3   r   r   rK   s    r   r-   zLambertAxes.clear  s4    
&&}77777r   c                 D    |                      | j        | j        |          S r   )r]  rM  rN  r  s     r   rS   zLambertAxes._get_core_transform  s)    $$"!  	r   c                 l    t                                          d                              dd          S )Ng      ?rj   )r   r[   r]   r6   s    r   rV   z!LambertAxes._get_affine_transform  s(    zzU4[[YsC  	!r   )r%   r&   r'   r  r   r]  r\  r   r-   rS   rV   r   r   s   @r   rG  rG    s        D%" %" %" %" %"= %" %" %"N" " " " "= " " "> 01!       8 8 8 8 8
  ! ! ! ! ! ! !r   rG  ) numpyr   
matplotlibrF   r   matplotlib.axesr   matplotlib.axisaxisr/   matplotlib.patchesr   matplotlib.pathr   matplotlib.spinesr4   r   matplotlib.tickerr   r	   r
   r   matplotlib.transformsr   r   r   r   r   r   r  r%  rG  r)   r   r   <module>rw     s                                   % % % % % %             # # # # # #9 9 9 9 9 9 9 9 9 9 9 9 F F F F F F F F F FV V V V Vd V V VrA A A A AI A A A.+0 +0 +0 +0 +0 +0 +0 +0\*0 *0 *0 *0 *0 *0 *0 *0ZC3 C3 C3 C3 C3G C3 C3 C3L_! _! _! _! _!' _! _! _! _! _!r   