B
    ]”t\ÝI  ã               @   sè   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	„ 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)Ú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dd„ Zd	d
„ Z	dd„ Z
d7dd„Zdd„ Zdd„ Zd8d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 d6S )9Ú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   sH   |t j d }t  || j ¡| j }td r<td s<d| S d| S d S )Ng     €f@ztext.usetexztext.latex.unicodez$%0.0f^\circ$u   %0.0fÂ°)ÚnpÚpiÚroundr   r   )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             C   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       @)r   ÚclaÚset_longitude_gridÚset_latitude_gridÚset_longitude_grid_endsr"   Zset_minor_locatorr   r#   Zset_ticks_positionZset_tick_paramsÚgridr   Úset_xlimr   r   Úset_ylim)r   r   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   r   Ú_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 )Nr.   r   r/   g      à?)r3   Ztransform_pointr   r   r
   r6   r8   )r   Ú	transformZxscaleÚ_Zyscaler   r   r   r5   q   s    
zGeoAxes._get_affine_transformr+   c             C   s   |dkrt dƒ‚| jS )N)Útick1Útick2r+   z2'which' must be one of 'tick1', 'tick2', or 'grid')Ú
ValueErrorr:   )r   Úwhichr   r   r   Úget_xaxis_transformy   s    zGeoAxes.get_xaxis_transformc             C   s   | j ddfS )NZbottomÚcenter)r;   )r   Úpadr   r   r   Úget_xaxis_text1_transform   s    z!GeoAxes.get_xaxis_text1_transformc             C   s   | j ddfS )NÚtoprH   )r<   )r   rI   r   r   r   Úget_xaxis_text2_transform‚   s    z!GeoAxes.get_xaxis_text2_transformc             C   s   |dkrt dƒ‚| jS )N)rC   rD   r+   z2'which' must be one of 'tick1', 'tick2', or 'grid')rE   r=   )r   rF   r   r   r   Úget_yaxis_transform…   s    zGeoAxes.get_yaxis_transformc             C   s   | j ddfS )NrH   Úright)r>   )r   rI   r   r   r   Úget_yaxis_text1_transform‹   s    z!GeoAxes.get_yaxis_text1_transformc             C   s   | j ddfS )NrH   Úleft)r?   )r   rI   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 )NznIt is not possible to change axes limits for geographic projections. Please consider using Basemap or Cartopy.)Ú	TypeError)r   rV   rW   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 )z0return a format string formatting the coordinateg        ÚNÚSÚEÚWu   %fÂ°%s, %fÂ°%s)r   Zrad2degÚabs)r   ÚlonÚ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   rd   r#   re   r   rf   rg   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   rf   r7   r9   Úclearr6   r8   )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 *True* if 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 *True* if 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   rn   Úkeyr   rm   r   r   r   Údrag_paní   s    zGeoAxes.drag_panN)r+   )r+   )!r   r   r   r   r   r   r4   r$   r'   r@   r5   rG   rJ   rL   rM   rO   rQ   rR   rT   rX   Z
set_xscaler,   r-   rb   r(   r)   r*   rj   rk   rl   ro   rp   rr   r   r   r   r   r      s:   3

		
r   c               @   s:   e Zd ZdZdZdZdd„ Zdd„ Zdd„ Ze	jj
e_
d	S )
Ú_GeoTransformr/   Fc             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   Ú
resolutionr   r   r   r   ÷   s    
z_GeoTransform.__init__c             C   s   d  t| ƒj| j¡S )Nz{}({}))ÚformatÚtyper   rt   )r   r   r   r   Ú__str__  s    z_GeoTransform.__str__c             C   s&   |j }| | j¡}t|  |j ¡|jƒS )N)ÚverticesZinterpolatedrt   r   rA   Zcodes)r   Úpathry   Zipathr   r   r   Útransform_path_non_affine  s    z'_GeoTransform.transform_path_non_affineN)r   r   r   Z
input_dimsZoutput_dimsZis_separabler   rx   r{   r   r   r   r   r   r   rs   ñ   s   
rs   c               @   s@   e Zd ZdZG dd„ deƒZG dd„ deƒZdd„ Zdd	„ Zd
S )Ú
AitoffAxesZaitoffc               @   s4   e Zd ZdZdd„ Zejje_dd„ Zejje_dS )zAitoffAxes.AitoffTransformzThe base Aitoff transform.c       	      C   s¨   |d d …df }|d d …df }|d }t  |¡}t  |t  |¡ ¡}d||dk< t  |¡| }t  |t¡}|t  |¡ | |d d …df< t  |¡| |d d …df< |S )Nr   r.   g       @g#B’¡œÇ;g        )r   ÚcosZarccosÚsinZ
empty_likeÚfloat)	r   ÚllÚ	longitudeÚlatitudeÚ	half_longÚcos_latitudeÚalphaZ
sinc_alphaÚxyr   r   r   Útransform_non_affine  s    
z/AitoffAxes.AitoffTransform.transform_non_affinec             C   s   t  | j¡S )N)r|   ÚInvertedAitoffTransformrt   )r   r   r   r   Úinverted&  s    z#AitoffAxes.AitoffTransform.invertedN)r   r   r   r   r‡   r   r‰   r   r   r   r   ÚAitoffTransform  s
   
rŠ   c               @   s0   e Zd Zdd„ Zejje_dd„ Zejje_dS )z"AitoffAxes.InvertedAitoffTransformc             C   s   |S )Nr   )r   r†   r   r   r   r‡   ,  s    z7AitoffAxes.InvertedAitoffTransform.transform_non_affinec             C   s   t  | j¡S )N)r|   rŠ   rt   )r   r   r   r   r‰   1  s    z+AitoffAxes.InvertedAitoffTransform.invertedN)r   r   r   r‡   r   r   r‰   r   r   r   r   rˆ   *  s   
rˆ   c             O   s:   t jd | _tj| f|ž|Ž | jdddd |  ¡  d S )Ng       @g      à?ÚboxÚC)Ú
adjustableÚanchor)r   r   r7   r   r   Ú
set_aspectr'   )r   rV   rW   r   r   r   r   5  s    zAitoffAxes.__init__c             C   s
   |   |¡S )N)rŠ   )r   ru   r   r   r   r3   ;  s    zAitoffAxes._get_core_transformN)	r   r   r   Únamers   rŠ   rˆ   r   r3   r   r   r   r   r|     s
   r|   c               @   s@   e Zd ZdZG dd„ deƒZG dd„ deƒZdd„ Zdd	„ Zd
S )Ú
HammerAxesZhammerc               @   s4   e Zd ZdZdd„ Zejje_dd„ Zejje_dS )zHammerAxes.HammerTransformzThe base Hammer transform.c       
      C   s˜   |d d …dd…f }|d d …dd…f }|d }t  |¡}t  d¡}t  d|t  |¡  ¡}d| |t  |¡  | }|t  |¡ | }	t  ||	fd¡S )Nr   r.   r/   g       @g      ð?)r   r}   Úsqrtr~   Úconcatenate)
r   r€   r   r‚   rƒ   r„   Zsqrt2r…   r   rm   r   r   r   r‡   E  s    

z/HammerAxes.HammerTransform.transform_non_affinec             C   s   t  | j¡S )N)r‘   ÚInvertedHammerTransformrt   )r   r   r   r   r‰   T  s    z#HammerAxes.HammerTransform.invertedN)r   r   r   r   r‡   r   r‰   r   r   r   r   ÚHammerTransformB  s
   
r•   c               @   s0   e Zd Zdd„ Zejje_dd„ Zejje_dS )z"HammerAxes.InvertedHammerTransformc             C   sn   |j \}}t d|d d  |d d  ¡}dt || dd|d  d   ¡ }t || ¡}t ||g¡S )Nr.   r0   r/   )ÚTr   r’   ÚarctanÚarcsinZcolumn_stack)r   r†   r   rm   Úzr   r‚   r   r   r   r‡   Z  s
    
"&z7HammerAxes.InvertedHammerTransform.transform_non_affinec             C   s   t  | j¡S )N)r‘   r•   rt   )r   r   r   r   r‰   b  s    z+HammerAxes.InvertedHammerTransform.invertedN)r   r   r   r‡   r   r   r‰   r   r   r   r   r”   X  s   
r”   c             O   s:   t jd | _tj| f|ž|Ž | jdddd |  ¡  d S )Ng       @g      à?r‹   rŒ   )r   rŽ   )r   r   r7   r   r   r   r'   )r   rV   rW   r   r   r   r   f  s    zHammerAxes.__init__c             C   s
   |   |¡S )N)r•   )r   ru   r   r   r   r3   l  s    zHammerAxes._get_core_transformN)	r   r   r   r   rs   r•   r”   r   r3   r   r   r   r   r‘   ?  s
   r‘   c               @   s@   e Zd ZdZG dd„ deƒZG dd„ deƒZdd„ Zdd	„ Zd
S )ÚMollweideAxesZ	mollweidec               @   s4   e Zd ZdZdd„ Zejje_dd„ Zejje_dS )z MollweideAxes.MollweideTransformzThe base Mollweide transform.c                s|  ‡ fdd„}|d d …df }|d d …df }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 )Nr.   gü©ñÒMbP?)r   r~   r}   r^   )ÚthetaÚdelta)Úpi_sin_lr   r   Údw  s    z@MollweideAxes.MollweideTransform.transform_non_affine.<locals>.dr   r.   r/   gƒÀÊ¡E¶?)Zdtypeg       @g      à?é   gUUUUUUÕ?)r   r   r^   ÚemptyÚshaper   Úanyr~   Zsignr’   r}   )r   r€   rž   r   r‚   ÚclatZihighZilowZauxr›   rœ   Zlarge_deltaÚer†   r   )r   r   r‡   v  s.    
 . z5MollweideAxes.MollweideTransform.transform_non_affinec             C   s   t  | j¡S )N)rš   ÚInvertedMollweideTransformrt   )r   r   r   r   r‰   ™  s    z)MollweideAxes.MollweideTransform.invertedN)r   r   r   r   r‡   r   r‰   r   r   r   r   ÚMollweideTransforms  s
   !
r¦   c               @   s0   e Zd Zdd„ Zejje_dd„ Zejje_dS )z(MollweideAxes.InvertedMollweideTransformc             C   s   |d d …dd…f }|d d …dd…f }t  |t  d¡ ¡}t jdt  d¡  | t  |¡ }t  d| t  d| ¡ t j ¡}t  ||fd¡S )Nr   r.   r/   )r   r˜   r’   r   r}   r~   r“   )r   r†   r   rm   r›   r_   r`   r   r   r   r‡   Ÿ  s    ""z=MollweideAxes.InvertedMollweideTransform.transform_non_affinec             C   s   t  | j¡S )N)rš   r¦   rt   )r   r   r   r   r‰   ¬  s    z1MollweideAxes.InvertedMollweideTransform.invertedN)r   r   r   r‡   r   r   r‰   r   r   r   r   r¥     s   
r¥   c             O   s:   t jd | _tj| f|ž|Ž | jdddd |  ¡  d S )Ng       @g      à?r‹   rŒ   )r   rŽ   )r   r   r7   r   r   r   r'   )r   rV   rW   r   r   r   r   °  s    zMollweideAxes.__init__c             C   s
   |   |¡S )N)r¦   )r   ru   r   r   r   r3   ¶  s    z!MollweideAxes._get_core_transformN)	r   r   r   r   rs   r¦   r¥   r   r3   r   r   r   r   rš   p  s
   *rš   c               @   sX   e Zd ZdZG dd„ deƒZG dd„ deƒZdddœdd	„Zd
d„ Zdd„ Z	dd„ Z
dS )ÚLambertAxesZlambertc               @   s<   e Zd ZdZdd„ Zdd„ Zejje_dd„ Zejje_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)rs   r   Ú_center_longitudeÚ_center_latitude)r   Úcenter_longitudeÚcenter_latituderu   r   r   r   r   À  s    z%LambertAxes.LambertTransform.__init__c             C   sä   |d d …dd…f }|d d …dd…f }| j }| j}t |¡}t |¡}|| }t |¡}	dt |¡|  t |¡| |	  }
t |
dkd|
¡}
t d|
 ¡}|| t |¡ }|t |¡| t |¡| |	   }t ||fd¡S )Nr   r.   r/   g      ð?g        gVçž¯Ò<g       @)r¨   r©   r   r}   r~   Úwherer’   r“   )r   r€   r   r‚   Úclongr£   Zcos_latZsin_latZ	diff_longZcos_diff_longZinner_kÚkr   rm   r   r   r   r‡   Ê  s     


z1LambertAxes.LambertTransform.transform_non_affinec             C   s   t  | j| j| j¡S )N)r§   ÚInvertedLambertTransformr¨   r©   rt   )r   r   r   r   r‰   á  s    z%LambertAxes.LambertTransform.invertedN)r   r   r   r   r   r‡   r   r‰   r   r   r   r   ÚLambertTransform½  s   

r°   c               @   s8   e Zd Zdd„ Zdd„ Zejje_dd„ Zejje_dS )z$LambertAxes.InvertedLambertTransformc             C   s   t  | |¡ || _|| _d S )N)rs   r   r¨   r©   )r   rª   r«   ru   r   r   r   r   ê  s    z-LambertAxes.InvertedLambertTransform.__init__c          	   C   sò   |d d …dd…f }|d d …dd…f }| j }| j}t || ||  ¡}t |dkd|¡}dt d| ¡ }t |¡}t |¡}	t |	t |¡ || t |¡ |  ¡}
|t || |t |¡ |	 |t |¡ |   ¡ }t 	||
fd¡S )Nr   r.   r/   g        g•Ö&è.>g       @g      à?)
r¨   r©   r   r’   r¬   r˜   r~   r}   r—   r“   )r   r†   r   rm   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©   rt   )r   r   r   r   r‰     s    z-LambertAxes.InvertedLambertTransform.invertedN)r   r   r   r   r‡   r   r   r‰   r   r   r   r   r¯   è  s
   
r¯   r   )rª   r«   c            O   sF   t jd | _|| _|| _tj| f|ž|Ž | jdddd |  ¡  d S )Nr/   Zequalr‹   rŒ   )r   rŽ   )	r   r   r7   r¨   r©   r   r   r   r'   )r   rª   r«   rV   rW   r   r   r   r   	  s    zLambertAxes.__init__c             C   s   t  | ¡ | j tƒ ¡ d S )N)r   r'   r#   rg   r	   )r   r   r   r   r'     s    
zLambertAxes.clac             C   s   |   | j| j|¡S )N)r°   r¨   r©   )r   ru   r   r   r   r3     s    zLambertAxes._get_core_transformc             C   s   t ƒ  d¡ dd¡S )Ng      Ð?g      à?)r
   r6   r8   )r   r   r   r   r5     s    z!LambertAxes._get_affine_transformN)r   r   r   r   rs   r°   r¯   r   r'   r3   r5   r   r   r   r   r§   º  s   +!r§   )Znumpyr   Z
matplotlibr   Zmatplotlib.axesr   Zmatplotlib.axisZaxisr!   Zmatplotlib.patchesr   Zmatplotlib.pathr   Zmatplotlib.spinesZspinesrS   Zmatplotlib.tickerr   r   r   r	   Zmatplotlib.transformsr
   r   r   r   rs   r|   r‘   rš   r§   r   r   r   r   Ú<module>   s     c31J