B
    ·ôJdÃC  ã               @   sä   d dl Zd dlmZ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	„ d	eƒZG d
d„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZdS )é    N)Ú_apiÚrcParams)ÚAxes)ÚCircle)ÚPath)Ú	FormatterÚNullLocatorÚFixedLocatorÚNullFormatter)ÚAffine2DÚBboxTransformToÚ	Transformc                   sø   e Zd ZdZG dd„ deƒZdZdd„ Z‡ fdd„Zd	d
„ Z	dd„ Z
d6dd„Zdd„ Zdd„ Zd7dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZeZd d!„ ZeZd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Z ‡  Z!S )8ÚGeoAxesz2An abstract base class for geographic projections.c               @   s$   e Zd ZdZddd„Zd	dd„ZdS )
zGeoAxes.ThetaFormatterz‹
        Used to format the theta tick labels.  Converts the native
        unit of radians into degrees and adds a degree symbol.
        ç      ð?c             C   s
   || _ d S )N)Ú	_round_to)ÚselfZround_to© r   úL/var/www/html/venv/lib/python3.7/site-packages/matplotlib/projections/geo.pyÚ__init__   s    zGeoAxes.ThetaFormatter.__init__Nc             C   s&   t t |¡| j ƒ| j }|d›dS )Nz0.0fõ   Â°)ÚroundÚnpÚrad2degr   )r   ÚxÚposÚdegreesr   r   r   Ú__call__   s    zGeoAxes.ThetaFormatter.__call__)r   )N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   ÚThetaFormatter   s   
r!   éK   c             C   s$   t  | ¡| _t  | ¡| _|  ¡  d S )N)ÚmaxisZXAxisÚxaxisZYAxisÚyaxisZ_update_transScale)r   r   r   r   Ú
_init_axis   s    zGeoAxes._init_axisc                s¬   t ƒ  ¡  |  d¡ |  d¡ |  d¡ | j tƒ ¡ | j tƒ ¡ | j 	d¡ | j 	d¡ | jj
dd |  td ¡ t | tj tj¡ t | tj d tjd ¡ d S )	Né   é   r"   ÚnoneT)Zlabel1Onz	axes.gridg       @)ÚsuperÚclaÚset_longitude_gridÚset_latitude_gridÚset_longitude_grid_endsr$   Zset_minor_locatorr   r%   Zset_ticks_positionZset_tick_paramsÚgridr   r   Úset_xlimr   ÚpiÚset_ylim)r   )Ú	__class__r   r   r+   '   s    



zGeoAxes.clac             C   s0  |   | j¡| _|  ¡ | _t| jƒ| _| j| j | j | _t	ƒ  
d| jd ¡ d| j ¡| _| j| j | _t	ƒ  
dd¡| j t	ƒ  dd¡ | _t	ƒ  
dd¡| j t	ƒ  dd¡ | _t	ƒ  
tjd d¡ tj d¡}t	ƒ  
dd¡}|| j | _|| j || j | j  }|t	ƒ  dd¡ | _|t	ƒ  dd¡ | _d S )	Né   é   r   é   éüÿÿÿgš™™™™™ñ?iøÿÿÿé   )Ú_get_core_transformÚ
RESOLUTIONZtransProjectionÚ_get_affine_transformZtransAffiner   ZbboxZ	transAxesZ	transDatar   ÚscaleÚ_longitude_capÚ	translateÚ_xaxis_pretransformÚ_xaxis_transformÚ_xaxis_text1_transformÚ_xaxis_text2_transformr   r1   Ú_yaxis_transformÚ_yaxis_text1_transformÚ_yaxis_text2_transform)r   Zyaxis_stretchZyaxis_spaceZyaxis_text_baser   r   r   Ú_set_lim_and_transforms:   s2    



 

zGeoAxes._set_lim_and_transformsc             C   sT   |   d¡}| tjdf¡\}}| dtjd f¡\}}tƒ  d| d| ¡ dd¡S )Nr4   r   r5   g      à?)r9   Ú	transformr   r1   r   r<   r>   )r   rG   ZxscaleÚ_Zyscaler   r   r   r;   m   s    
zGeoAxes._get_affine_transformr/   c             C   s   t jdddg|d | jS )NÚtick1Útick2r/   )Úwhich)r   Úcheck_in_listr@   )r   rK   r   r   r   Úget_xaxis_transformu   s    zGeoAxes.get_xaxis_transformc             C   s   | j ddfS )NÚbottomÚcenter)rA   )r   Úpadr   r   r   Úget_xaxis_text1_transformy   s    z!GeoAxes.get_xaxis_text1_transformc             C   s   | j ddfS )NÚtoprO   )rB   )r   rP   r   r   r   Úget_xaxis_text2_transform|   s    z!GeoAxes.get_xaxis_text2_transformc             C   s   t jdddg|d | jS )NrI   rJ   r/   )rK   )r   rL   rC   )r   rK   r   r   r   Úget_yaxis_transform   s    zGeoAxes.get_yaxis_transformc             C   s   | j ddfS )NrO   Úright)rD   )r   rP   r   r   r   Úget_yaxis_text1_transformƒ   s    z!GeoAxes.get_yaxis_text1_transformc             C   s   | j ddfS )NrO   Úleft)rE   )r   rP   r   r   r   Úget_yaxis_text2_transform†   s    z!GeoAxes.get_yaxis_text2_transformc             C   s
   t ddƒS )N)g      à?g      à?g      à?)r   )r   r   r   r   Ú_gen_axes_patch‰   s    zGeoAxes._gen_axes_patchc             C   s   dt j | dd¡iS )NZgeo)g      à?g      à?g      à?)ÚmspinesZSpineZcircular_spine)r   r   r   r   Ú_gen_axes_spinesŒ   s    zGeoAxes._gen_axes_spinesc             O   s   |d dkrt ‚d S )Nr   Zlinear)ÚNotImplementedError)r   ÚargsÚkwargsr   r   r   Ú
set_yscale   s    zGeoAxes.set_yscalec             O   s   t dƒ‚dS )z-Not supported. Please consider using Cartopy.zaChanging axes limits of a geographic projection is not supported.  Please consider using Cartopy.N)Ú	TypeError)r   r]   r^   r   r   r   r0   •   s    zGeoAxes.set_xlimc             C   sN   t  ||g¡\}}|dkr d}nd}|dkr2d}nd}dt|ƒ|t|ƒ|f S )z1Return a format string formatting the coordinate.g        ÚNÚSÚEÚWu   %fÂ°%s, %fÂ°%s)r   r   Úabs)r   ZlonZlatÚnsÚewr   r   r   Úformat_coordœ   s    zGeoAxes.format_coordc             C   s>   t  d| d|¡}| j tt  |¡ƒ¡ | j |  |¡¡ dS )zH
        Set the number of degrees between each longitude grid.
        iLÿÿÿé´   N)r   Úaranger$   Úset_major_locatorr	   Údeg2radÚset_major_formatterr!   )r   r   r/   r   r   r   r,   ª   s    zGeoAxes.set_longitude_gridc             C   s>   t  d| d|¡}| j tt  |¡ƒ¡ | j |  |¡¡ dS )zG
        Set the number of degrees between each latitude grid.
        i¦ÿÿÿéZ   N)r   rj   r%   rk   r	   rl   rm   r!   )r   r   r/   r   r   r   r-   ³   s    zGeoAxes.set_latitude_gridc             C   s4   t  |¡| _| j ¡  d| jd ¡ d| j ¡ dS )zS
        Set the latitude(s) at which to stop drawing the longitude grids.
        g      ð?g       @g        N)r   rl   r=   r?   Úclearr<   r>   )r   r   r   r   r   r.   ¼   s    
zGeoAxes.set_longitude_grid_endsc             C   s   dS )z+Return the aspect ratio of the data itself.g      ð?r   )r   r   r   r   Úget_data_ratioÆ   s    zGeoAxes.get_data_ratioc             C   s   dS )z—
        Return whether this axes supports the zoom box button functionality.

        This axes object does not support interactive zoom box.
        Fr   )r   r   r   r   Úcan_zoomÌ   s    zGeoAxes.can_zoomc             C   s   dS )z—
        Return whether this axes supports the pan/zoom button functionality.

        This axes object does not support interactive pan/zoom.
        Fr   )r   r   r   r   Úcan_panÔ   s    zGeoAxes.can_panc             C   s   d S )Nr   )r   r   ÚyÚbuttonr   r   r   Ú	start_panÜ   s    zGeoAxes.start_panc             C   s   d S )Nr   )r   r   r   r   Úend_panß   s    zGeoAxes.end_panc             C   s   d S )Nr   )r   rt   Úkeyr   rs   r   r   r   Údrag_panâ   s    zGeoAxes.drag_pan)r/   )r/   )"r   r   r   r    r   r!   r:   r&   r+   rF   r;   rM   rQ   rS   rT   rV   rX   rY   r[   r_   Z
set_xscaler0   r2   rh   r,   r-   r.   rp   rq   rr   ru   rv   rx   Ú__classcell__r   r   )r3   r   r      s:   3

		
r   c                   s4   e Zd Zd ZZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )Ú_GeoTransformr5   c                s   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   Ú
resolution)r3   r   r   r   ê   s    
z_GeoTransform.__init__c             C   s   d  t| ƒj| j¡S )Nz{}({}))ÚformatÚtyper   r{   )r   r   r   r   Ú__str__ô   s    z_GeoTransform.__str__c             C   s    |  | j¡}t|  |j¡|jƒS )N)Zinterpolatedr{   r   rG   ZverticesÚcodes)r   ÚpathZipathr   r   r   Útransform_path_non_affine÷   s    z'_GeoTransform.transform_path_non_affine)	r   r   r   Z
input_dimsZoutput_dimsr   r   r‚   ry   r   r   )r3   r   rz   æ   s   
rz   c                   sH   e Zd ZdZG dd„ deƒZG dd„ deƒZ‡ fdd„Zdd	„ Z‡  Z	S )
Ú
AitoffAxesZaitoffc               @   s    e Zd ZdZdd„ Zdd„ ZdS )zAitoffAxes.AitoffTransformzThe base Aitoff transform.c       
      C   sn   |j \}}|d }t |¡}t |t |¡ ¡}t |tj ¡}|t |¡ | }t |¡| }	t ||	g¡S )Ng       @)ÚTr   ÚcosZarccosZsincr1   ÚsinÚcolumn_stack)
r   ÚllÚ	longitudeÚlatitudeÚ	half_longÚcos_latitudeÚalphaZ
sinc_alphar   rs   r   r   r   Útransform_non_affine  s    

z/AitoffAxes.AitoffTransform.transform_non_affinec             C   s   t  | j¡S )N)rƒ   ÚInvertedAitoffTransformr{   )r   r   r   r   Úinverted  s    z#AitoffAxes.AitoffTransform.invertedN)r   r   r   r    rŽ   r   r   r   r   r   ÚAitoffTransform   s   r‘   c               @   s   e Zd Zdd„ Zdd„ ZdS )z"AitoffAxes.InvertedAitoffTransformc             C   s   t  |t j¡S )N)r   Z	full_likeÚnan)r   Úxyr   r   r   rŽ     s    z7AitoffAxes.InvertedAitoffTransform.transform_non_affinec             C   s   t  | j¡S )N)rƒ   r‘   r{   )r   r   r   r   r     s    z+AitoffAxes.InvertedAitoffTransform.invertedN)r   r   r   rŽ   r   r   r   r   r   r     s   r   c                s6   t jd | _tƒ j||Ž | jdddd |  ¡  d S )Ng       @g      à?ÚboxÚC)Ú
adjustableÚanchor)r   r1   r=   r*   r   Ú
set_aspectr+   )r   r]   r^   )r3   r   r   r   !  s    zAitoffAxes.__init__c             C   s
   |   |¡S )N)r‘   )r   r|   r   r   r   r9   '  s    zAitoffAxes._get_core_transform)
r   r   r   Únamerz   r‘   r   r   r9   ry   r   r   )r3   r   rƒ   ý   s
   rƒ   c                   sH   e Zd ZdZG dd„ deƒZG dd„ deƒZ‡ fdd„Zdd	„ Z‡  Z	S )
Ú
HammerAxesÚhammerc               @   s    e Zd ZdZdd„ Zdd„ ZdS )zHammerAxes.HammerTransformzThe base Hammer transform.c       
      C   sx   |j \}}|d }t |¡}t d¡}t d|t |¡  ¡}d| |t |¡  | }|t |¡ | }	t ||	g¡S )Ng       @g      ð?)r„   r   r…   Úsqrtr†   r‡   )
r   rˆ   r‰   rŠ   r‹   rŒ   Zsqrt2r   r   rs   r   r   r   rŽ   1  s    


z/HammerAxes.HammerTransform.transform_non_affinec             C   s   t  | j¡S )N)rš   ÚInvertedHammerTransformr{   )r   r   r   r   r   <  s    z#HammerAxes.HammerTransform.invertedN)r   r   r   r    rŽ   r   r   r   r   r   ÚHammerTransform.  s   rž   c               @   s   e Zd Zdd„ Zdd„ ZdS )z"HammerAxes.InvertedHammerTransformc             C   sn   |j \}}t d|d d  |d d  ¡}dt || dd|d  d   ¡ }t || ¡}t ||g¡S )Nr4   r6   r5   )r„   r   rœ   ÚarctanÚarcsinr‡   )r   r“   r   rs   Úzr‰   rŠ   r   r   r   rŽ   B  s
    
"&z7HammerAxes.InvertedHammerTransform.transform_non_affinec             C   s   t  | j¡S )N)rš   rž   r{   )r   r   r   r   r   J  s    z+HammerAxes.InvertedHammerTransform.invertedN)r   r   r   rŽ   r   r   r   r   r   r   @  s   r   c                s6   t jd | _tƒ j||Ž | jdddd |  ¡  d S )Ng       @g      à?r”   r•   )r–   r—   )r   r1   r=   r*   r   r˜   r+   )r   r]   r^   )r3   r   r   r   N  s    zHammerAxes.__init__c             C   s
   |   |¡S )N)rž   )r   r|   r   r   r   r9   T  s    zHammerAxes._get_core_transform)
r   r   r   r™   rz   rž   r   r   r9   ry   r   r   )r3   r   rš   +  s
   rš   c                   sH   e Zd ZdZG dd„ deƒZG dd„ deƒZ‡ fdd„Zdd	„ Z‡  Z	S )
ÚMollweideAxesZ	mollweidec               @   s    e Zd ZdZdd„ Zdd„ ZdS )z MollweideAxes.MollweideTransformzThe base Mollweide transform.c                sf  ‡ fdd„}|j \}}tjd t |¡ }|dk }| }tj|jtd}| ¡ r¸tjt || ¡ ‰ d||  }	||	ƒ\}
}x.t |¡rª|	|  |
| 7  < ||	ƒ\}
}q~W |	d ||< | ¡ r|| }ddtj |d  d	  }tjd | t 	|| ¡ ||< tj|jtd}dt 
d¡ tj | t |¡ |d d …d
f< t 
d¡t |¡ |d d …df< |S )Nc                s4   | t  | ¡ ˆ   dt  | ¡  }|t  |¡dkfS )Nr4   gü©ñÒMbP?)r   r†   r…   re   )ÚthetaÚdelta)Úpi_sin_lr   r   Úd`  s    z@MollweideAxes.MollweideTransform.transform_non_affine.<locals>.dr5   gƒÀÊ¡E¶?)Zdtypeg       @g      à?é   gUUUUUUÕ?r   r4   )r„   r   r1   re   ÚemptyÚshapeÚfloatÚanyr†   Úsignrœ   r…   )r   rˆ   r¦   r‰   rŠ   ÚclatZihighZilowZauxr£   r¤   Zlarge_deltaÚer“   r   )r¥   r   rŽ   ^  s,    

 . z5MollweideAxes.MollweideTransform.transform_non_affinec             C   s   t  | j¡S )N)r¢   ÚInvertedMollweideTransformr{   )r   r   r   r   r   €  s    z)MollweideAxes.MollweideTransform.invertedN)r   r   r   r    rŽ   r   r   r   r   r   ÚMollweideTransform[  s   "r°   c               @   s   e Zd Zdd„ Zdd„ ZdS )z(MollweideAxes.InvertedMollweideTransformc             C   sp   |j \}}t |t d¡ ¡}tjdt d¡  | t |¡ }t d| t d| ¡ tj ¡}t ||g¡S )Nr5   )r„   r   r    rœ   r1   r…   r†   r‡   )r   r“   r   rs   r£   r‰   rŠ   r   r   r   rŽ   †  s
    
""z=MollweideAxes.InvertedMollweideTransform.transform_non_affinec             C   s   t  | j¡S )N)r¢   r°   r{   )r   r   r   r   r     s    z1MollweideAxes.InvertedMollweideTransform.invertedN)r   r   r   rŽ   r   r   r   r   r   r¯   „  s   
r¯   c                s6   t jd | _tƒ j||Ž | jdddd |  ¡  d S )Ng       @g      à?r”   r•   )r–   r—   )r   r1   r=   r*   r   r˜   r+   )r   r]   r^   )r3   r   r   r   ”  s    zMollweideAxes.__init__c             C   s
   |   |¡S )N)r°   )r   r|   r   r   r   r9   š  s    z!MollweideAxes._get_core_transform)
r   r   r   r™   rz   r°   r¯   r   r9   ry   r   r   )r3   r   r¢   X  s
   )r¢   c                   sd   e Zd ZdZG dd„ deƒZG dd„ deƒZdddœ‡ fdd	„
Z‡ fd
d„Zdd„ Z	dd„ Z
‡  ZS )ÚLambertAxesZlambertc               @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	zLambertAxes.LambertTransformzThe base Lambert transform.c             C   s   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)rz   r   Ú_center_longitudeÚ_center_latitude)r   Úcenter_longitudeÚcenter_latituder|   r   r   r   r   ¤  s    z%LambertAxes.LambertTransform.__init__c             C   sº   |j \}}| j}| j}t |¡}t |¡}|| }t |¡}	t dt |¡|  t |¡| |	  d¡}
t d|
 ¡}|| t |¡ }|t |¡| t |¡| |	   }t ||g¡S )Nr4   gVçž¯Ò<r5   )	r„   r²   r³   r   r…   r†   Úmaximumrœ   r‡   )r   rˆ   r‰   rŠ   Úclongr­   Zcos_latZsin_latZ	diff_longZcos_diff_longZinner_kÚkr   rs   r   r   r   rŽ   ®  s    



"$z1LambertAxes.LambertTransform.transform_non_affinec             C   s   t  | j| j| j¡S )N)r±   ÚInvertedLambertTransformr²   r³   r{   )r   r   r   r   r   Á  s    z%LambertAxes.LambertTransform.invertedN)r   r   r   r    r   rŽ   r   r   r   r   r   ÚLambertTransform¡  s   
rº   c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )z$LambertAxes.InvertedLambertTransformc             C   s   t  | |¡ || _|| _d S )N)rz   r   r²   r³   )r   r´   rµ   r|   r   r   r   r   Ê  s    z-LambertAxes.InvertedLambertTransform.__init__c          	   C   s¾   |j \}}| j}| j}t t ||¡d¡}dt d| ¡ }t |¡}t |¡}	t |	t |¡ || t |¡ |  ¡}
|t 	|| |t |¡ |	 |t |¡ |   ¡ }t 
||
g¡S )Ng•Ö&è.>r5   g      à?)r„   r²   r³   r   r¶   Úhypotr    r†   r…   rŸ   r‡   )r   r“   r   rs   r·   r­   ÚpÚcZsin_cZcos_crŠ   r‰   r   r   r   rŽ   Ï  s    


0z9LambertAxes.InvertedLambertTransform.transform_non_affinec             C   s   t  | j| j| j¡S )N)r±   rº   r²   r³   r{   )r   r   r   r   r   à  s    z-LambertAxes.InvertedLambertTransform.invertedN)r   r   r   r   rŽ   r   r   r   r   r   r¹   È  s   r¹   r   )r´   rµ   c               sB   t jd | _|| _|| _tƒ j||Ž | jdddd |  ¡  d S )Nr5   Úequalr”   r•   )r–   r—   )	r   r1   r=   r²   r³   r*   r   r˜   r+   )r   r´   rµ   r]   r^   )r3   r   r   r   ç  s    zLambertAxes.__init__c                s   t ƒ  ¡  | j tƒ ¡ d S )N)r*   r+   r%   rm   r
   )r   )r3   r   r   r+   ï  s    
zLambertAxes.clac             C   s   |   | j| j|¡S )N)rº   r²   r³   )r   r|   r   r   r   r9   ó  s    zLambertAxes._get_core_transformc             C   s   t ƒ  d¡ dd¡S )Ng      Ð?g      à?)r   r<   r>   )r   r   r   r   r;   ù  s    z!LambertAxes._get_affine_transform)r   r   r   r™   rz   rº   r¹   r   r+   r9   r;   ry   r   r   )r3   r   r±   ž  s   'r±   ) Únumpyr   Z
matplotlibr   r   Zmatplotlib.axesr   Zmatplotlib.axisZaxisr#   Zmatplotlib.patchesr   Zmatplotlib.pathr   Zmatplotlib.spinesZspinesrZ   Zmatplotlib.tickerr   r   r	   r
   Zmatplotlib.transformsr   r   r   r   rz   rƒ   rš   r¢   r±   r   r   r   r   Ú<module>   s    Y.-F