B
    cÃ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   ú9lib/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"   Z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   r0   Ú_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 )Nr3   r   r4   g      à?)r8   Ú	transformr   r0   r   r;   r=   )r   rF   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   rJ   r   r   r   Úget_xaxis_transformu   s    zGeoAxes.get_xaxis_transformc             C   s   | j ddfS )NZbottomÚcenter)r@   )r   Úpadr   r   r   Úget_xaxis_text1_transformy   s    z!GeoAxes.get_xaxis_text1_transformc             C   s   | j ddfS )NÚtoprM   )rA   )r   rN   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 )NrH   rI   r.   )rJ   )r   rK   rB   )r   rJ   r   r   r   Úget_yaxis_transform   s    zGeoAxes.get_yaxis_transformc             C   s   | j ddfS )NrM   Úright)rC   )r   rN   r   r   r   Úget_yaxis_text1_transformƒ   s    z!GeoAxes.get_yaxis_text1_transformc             C   s   | j ddfS )NrM   Úleft)rD   )r   rN   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   r/   •   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ÚnsZ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   rg   r%   rh   r	   ri   rj   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   ri   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   rq   Úkeyr   rp   r   r   r   Údrag_panâ   s    zGeoAxes.drag_pan)r.   )r.   )"r   r   r   r    r   r!   r9   r&   r*   rE   r:   rL   rO   rQ   rR   rT   rV   rW   rY   r]   Z
set_xscaler/   r1   re   r+   r,   r-   rm   rn   ro   rr   rs   ru   Ú__classcell__r   r   )r2   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 )Ú_GeoTransformr4   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)r2   r   r   r   ê   s    
z_GeoTransform.__init__c             C   s   d  t| ƒj| j¡S )Nz{}({}))ÚformatÚtyper   rx   )r   r   r   r   Ú__str__ô   s    z_GeoTransform.__str__c             C   s    |  | j¡}t|  |j¡|jƒS )N)Zinterpolatedrx   r   rF   ZverticesZ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~   rv   r   r   )r2   r   rw   æ   s   
rw   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sincr0   ÚsinÚcolumn_stack)
r   ÚllÚ	longitudeÚlatitudeÚ	half_longÚcos_latitudeÚalphaZ
sinc_alphar   rp   r   r   r   Útransform_non_affine  s    

z/AitoffAxes.AitoffTransform.transform_non_affinec             C   s   t  | j¡S )N)r   ÚInvertedAitoffTransformrx   )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   rx   )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   r0   r<   r)   r   Ú
set_aspectr*   )r   r[   r\   )r2   r   r   r   !  s    zAitoffAxes.__init__c             C   s
   |   |¡S )N)r   )r   ry   r   r   r   r8   '  s    zAitoffAxes._get_core_transform)
r   r   r   Únamerw   r   r‹   r   r8   rv   r   r   )r2   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 )
Ú
HammerAxesZ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   rp   r   r   r   rŠ   1  s    


z/HammerAxes.HammerTransform.transform_non_affinec             C   s   t  | j¡S )N)r–   ÚInvertedHammerTransformrx   )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 )Nr3   r5   r4   )r€   r   r—   ÚarctanÚarcsinrƒ   )r   r   r   rp   Úzr…   r†   r   r   r   rŠ   B  s
    
"&z7HammerAxes.InvertedHammerTransform.transform_non_affinec             C   s   t  | j¡S )N)r–   r™   rx   )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   r0   r<   r)   r   r”   r*   )r   r[   r\   )r2   r   r   r   N  s    zHammerAxes.__init__c             C   s
   |   |¡S )N)r™   )r   ry   r   r   r   r8   T  s    zHammerAxes._get_core_transform)
r   r   r   r•   rw   r™   r˜   r   r8   rv   r   r   )r2   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 )Nr3   gü©ñÒMbP?)r   r‚   r   rc   )ÚthetaÚdelta)Úpi_sin_lr   r   Úd`  s    z@MollweideAxes.MollweideTransform.transform_non_affine.<locals>.dr4   gƒÀÊ¡E¶?)Zdtypeg       @g      à?é   gUUUUUUÕ?r   r3   )r€   r   r0   rc   ÚemptyÚshapeÚfloatÚanyr‚   Z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   ÚInvertedMollweideTransformrx   )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 )Nr4   )r€   r   r›   r—   r0   r   r‚   rƒ   )r   r   r   rp   rž   r…   r†   r   r   r   rŠ   †  s
    
""z=MollweideAxes.InvertedMollweideTransform.transform_non_affinec             C   s   t  | j¡S )N)r   rª   rx   )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   r0   r<   r)   r   r”   r*   )r   r[   r\   )r2   r   r   r   ”  s    zMollweideAxes.__init__c             C   s
   |   |¡S )N)rª   )r   ry   r   r   r   r8   š  s    z!MollweideAxes._get_core_transform)
r   r   r   r•   rw   rª   r©   r   r8   rv   r   r   )r2   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)rw   r   Ú_center_longitudeÚ_center_latitude)r   Úcenter_longitudeÚcenter_latitudery   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 )Nr3   gVçž¯Ò<r4   )	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   rp   r   r   r   rŠ   ®  s    



"$z1LambertAxes.LambertTransform.transform_non_affinec             C   s   t  | j| j| j¡S )N)r«   ÚInvertedLambertTransformr¬   r­   rx   )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)rw   r   r¬   r­   )r   r®   r¯   ry   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•Ö&è.>r4   g      à?)r€   r¬   r­   r   r°   Zhypotr›   r‚   r   rš   rƒ   )r   r   r   rp   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­   rx   )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 )Nr4   Zequalr   r‘   )r’   r“   )	r   r0   r<   r¬   r­   r)   r   r”   r*   )r   r®   r¯   r[   r\   )r2   r   r   r   ç  s    zLambertAxes.__init__c                s   t ƒ  ¡  | j tƒ ¡ d S )N)r)   r*   r%   rj   r
   )r   )r2   r   r   r*   ï  s    
zLambertAxes.clac             C   s   |   | j| j|¡S )N)r´   r¬   r­   )r   ry   r   r   r   r8   ó  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•   rw   r´   r³   r   r*   r8   r:   rv   r   r   )r2   r   r«   ž  s   'r«   ) Znumpyr   Z
matplotlibr   r   Zmatplotlib.axesr   Zmatplotlib.axisZaxisr#   Zmatplotlib.patchesr   Zmatplotlib.pathr   Zmatplotlib.spinesZspinesrX   Zmatplotlib.tickerr   r   r	   r
   Zmatplotlib.transformsr   r   r   r   rw   r   r–   r   r«   r   r   r   r   Ú<module>   s    Y.-F