3
ƽh1D                 @   s   d dl Zd dlmZmZ d dlmZ d dljZ	d dl
mZ d dlmZ d dlj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)cbook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   @/tmp/pip-build-7iwl8md4/matplotlib/matplotlib/projections/geo.py__init__   s    zGeoAxes.ThetaFormatter.__init__Nc             C   s&   t tj|| 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 j| | _t j| | _| j  d S )N)maxisZXAxisxaxisZYAxisyaxisZ_update_transScale)r   r   r   r   
_init_axis   s    zGeoAxes._init_axisc             C   s   t j|  | jd | jd | jd | jjt  | jjt  | jj	d | jj	d | jj
dd | jtd  t j| tj tj t j| tj d tjd  d S )	N      r"   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   piset_ylim)r   r   r   r   r*   '   s    



zGeoAxes.clac             C   s0  | j | j| _| j | _t| j| _| j| j | j | _t	 j
d| jd jd| j | _| j| j | _t	 j
dd| j t	 jdd | _t	 j
dd| j t	 jdd | _t	 j
tjd djtj d}t	 j
dd}|| j | _|| j || j | j  }|t	 jdd | _|t	 j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   | j d}|jtjdf\}}|jdtjd f\}}t jd| d| jddS )Nr2   r   r3   g      ?)r7   	transformr   r0   r   r:   r<   )r   rE   Zxscale_Zyscaler   r   r   r9   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   rI   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toprL   )r@   )r   rM   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 )NrG   rH   r.   )rI   )r   rJ   rA   )r   rI   r   r   r   get_yaxis_transform   s    zGeoAxes.get_yaxis_transformc             C   s   | j ddfS )NrL   right)rB   )r   rM   r   r   r   get_yaxis_text1_transform   s    z!GeoAxes.get_yaxis_text1_transformc             C   s   | j ddfS )NrL   left)rC   )r   rM   r   r   r   get_yaxis_text2_transform   s    z!GeoAxes.get_yaxis_text2_transformc             C   s
   t ddS )N      ?)rV   rV   )r   )r   r   r   r   _gen_axes_patch   s    zGeoAxes._gen_axes_patchc             C   s   dt jj| ddiS )NZgeo      ?)rX   rX   )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 )NzaChanging axes limits of a geographic projection is not supported.  Please consider using Cartopy.)	TypeError)r   r\   r]   r   r   r   r/      s    zGeoAxes.set_xlimc             C   sN   t j||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 jd| d|}| jjtt j| | jj| j| dS )zH
        Set the number of degrees between each longitude grid.
           NiL)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 jd| d|}| jjtt j| | jj| j| dS )zG
        Set the number of degrees between each latitude grid.
        Z   Ni)r   ri   r%   rj   r	   rk   rl   r!   )r   r   r.   r   r   r   r,      s    zGeoAxes.set_latitude_gridc             C   s4   t j|| _| jj jd| jd jd| j  dS )zS
        Set the latitude(s) at which to stop drawing the longitude grids.
        g      ?g       @g        N)r   rk   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 *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   rs   keyr   rr   r   r   r   drag_pan   s    zGeoAxes.drag_panN)r.   )r.   )!r   r   r   r    r   r!   r8   r&   r*   rD   r9   rK   rN   rP   rQ   rS   rU   rW   rZ   r^   Z
set_xscaler/   r1   rg   r+   r,   r-   ro   rp   rq   rt   ru   rw   r   r   r   r   r      s:   3

		
r   c               @   s,   e Zd Zd ZZdd Zdd Zdd ZdS )	_GeoTransformr3   c             C   s   t j|  || _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j t| j| jS )Nz{}({}))formattyper   ry   )r   r   r   r   __str__   s    z_GeoTransform.__str__c             C   s    |j | j}t| j|j|jS )N)Zinterpolatedry   r   rE   Zverticescodes)r   pathZipathr   r   r   transform_path_non_affine   s    z'_GeoTransform.transform_path_non_affineN)r   r   r   Z
input_dimsZoutput_dimsr   r}   r   r   r   r   r   rx      s   
rx   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               @   s    e Zd ZdZdd Zdd ZdS )zAitoffAxes.AitoffTransformzThe base Aitoff transform.c       
      C   sx   |j \}}|d }tj|}tj|tj| }d||dk< tj|| }|tj| | }tj|| }	tj||	gS )Ng       @g#B;g        )Tr   cosZarccossincolumn_stack)
r   ll	longitudelatitude	half_longcos_latitudealphaZ
sinc_alphar   rr   r   r   r   transform_non_affine  s    

z/AitoffAxes.AitoffTransform.transform_non_affinec             C   s   t j| jS )N)r   InvertedAitoffTransformry   )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   |S )Nr   )r   xyr   r   r   r     s    z7AitoffAxes.InvertedAitoffTransform.transform_non_affinec             C   s   t j| jS )N)r   r   ry   )r   r   r   r   r     s    z+AitoffAxes.InvertedAitoffTransform.invertedN)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 | j  d S )Ng       @g      ?boxC)
adjustableanchor)r   r0   r;   r   r   
set_aspectr*   )r   r\   r]   r   r   r   r   #  s    zAitoffAxes.__init__c             C   s
   | j |S )N)r   )r   rz   r   r   r   r7   )  s    zAitoffAxes._get_core_transformN)	r   r   r   namerx   r   r   r   r7   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               @   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j|}tjd}tjd|tj|  }d| |tj|  | }|tj| | }	tj||	gS )Ng       @g      ?)r   r   r   sqrtr   r   )
r   r   r   r   r   r   Zsqrt2r   r   rr   r   r   r   r   3  s    


z/HammerAxes.HammerTransform.transform_non_affinec             C   s   t j| jS )N)r   InvertedHammerTransformry   )r   r   r   r   r   >  s    z#HammerAxes.HammerTransform.invertedN)r   r   r   r    r   r   r   r   r   r   HammerTransform0  s   r   c               @   s   e Zd Zdd Zdd ZdS )z"HammerAxes.InvertedHammerTransformc             C   sn   |j \}}tjd|d d  |d d  }dtj|| dd|d  d    }tj|| }tj||gS )Nr2   r4   r3   )r   r   r   arctanarcsinr   )r   r   r   rr   zr   r   r   r   r   r   D  s
    
"&z7HammerAxes.InvertedHammerTransform.transform_non_affinec             C   s   t j| jS )N)r   r   ry   )r   r   r   r   r   L  s    z+HammerAxes.InvertedHammerTransform.invertedN)r   r   r   r   r   r   r   r   r   r   B  s   r   c             O   s:   t jd | _tj| f|| | jdddd | j  d S )Ng       @g      ?r   r   )r   r   )r   r0   r;   r   r   r   r*   )r   r\   r]   r   r   r   r   P  s    zHammerAxes.__init__c             C   s
   | j |S )N)r   )r   rz   r   r   r   r7   V  s    zHammerAxes._get_core_transformN)	r   r   r   r   rx   r   r   r   r7   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               @   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j| }|dk }| }tj|jtd}|j rtjtj||   d||  }	||	\}
}x.tj|r|	|  |
| 7  < ||	\}
}q~W |	d ||< |j r|| }ddtj |d  d  }tjd | tj	||  ||< tj|jtd}dtj
d tj | tj| |d d d
f< tj
dtj| |d d df< |S )Nc                s4   | t j|     dt j|   }|t j|dkfS )Nr2   gMbP?)r   r   r   rd   )thetadelta)pi_sin_lr   r   db  s    z@MollweideAxes.MollweideTransform.transform_non_affine.<locals>.dr3   gʡE?)Zdtypeg       @g      ?   g      ?r   r2   gUUUUUU?)r   r   r0   rd   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| jS )N)r   InvertedMollweideTransformry   )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j|tjd }tjdtjd  | tj| }tjd| tjd|  tj }tj||gS )Nr3   )r   r   r   r   r0   r   r   r   )r   r   r   rr   r   r   r   r   r   r   r     s
    
""z=MollweideAxes.InvertedMollweideTransform.transform_non_affinec             C   s   t j| jS )N)r   r   ry   )r   r   r   r   r     s    z1MollweideAxes.InvertedMollweideTransform.invertedN)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 | j  d S )Ng       @g      ?r   r   )r   r   )r   r0   r;   r   r   r   r*   )r   r\   r]   r   r   r   r     s    zMollweideAxes.__init__c             C   s
   | j |S )N)r   )r   rz   r   r   r   r7     s    z!MollweideAxes._get_core_transformN)	r   r   r   r   rx   r   r   r   r7   r   r   r   r   r   Z  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dd ZdS )	zLambertAxes.LambertTransformzThe base Lambert transform.c             C   s   t j| | || _|| _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)rx   r   _center_longitude_center_latitude)r   center_longitudecenter_latituderz   r   r   r   r     s    z%LambertAxes.LambertTransform.__init__c             C   s   |j \}}| j}| j}tj|}tj|}|| }tj|}	tjdtj||  tj|| |	  d}
tjd|
 }|| tj| }|tj|| tj|| |	   }tj||gS )Nr2   gV瞯<r3   )	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   rr   r   r   r   r     s    



"$z1LambertAxes.LambertTransform.transform_non_affinec             C   s   t j| j| j| jS )N)r   InvertedLambertTransformr   r   ry   )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 j| | || _|| _d S )N)rx   r   r   r   )r   r   r   rz   r   r   r   r     s    z-LambertAxes.InvertedLambertTransform.__init__c             C   s   |j \}}| j}| j}tjtj||d}dtjd|  }tj|}tj|}	tj|	tj| || tj| |  }
|tj	|| |tj| |	 |tj| |    }tj
||
gS )Ng&.>r3   g      ?)r   r   r   r   r   hypotr   r   r   r   r   )r   r   r   rr   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| jS )N)r   r   r   r   ry   )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            O   sF   t jd | _|| _|| _tj| f|| | jdddd | j  d S )Nr3   equalr   r   )r   r   )	r   r0   r;   r   r   r   r   r   r*   )r   r   r   r\   r]   r   r   r   r     s    zLambertAxes.__init__c             C   s   t j|  | jjt  d S )N)r   r*   r%   rl   r
   )r   r   r   r   r*     s    
zLambertAxes.clac             C   s   | j | j| j|S )N)r   r   r   )r   rz   r   r   r   r7     s    zLambertAxes._get_core_transformc             C   s   t  jdjddS )Ng      ?g      ?)r   r:   r<   )r   r   r   r   r9     s    z!LambertAxes._get_affine_transformN)r   r   r   r   rx   r   r   r   r*   r7   r9   r   r   r   r   r     s   'r   ) numpyr   Z
matplotlibr   r   Zmatplotlib.axesr   Zmatplotlib.axisZaxisr#   Zmatplotlib.patchesr   Zmatplotlib.pathr   Zmatplotlib.spinesZspinesrY   Zmatplotlib.tickerr   r   r	   r
   Zmatplotlib.transformsr   r   r   r   rx   r   r   r   r   r   r   r   r   <module>   s   

 X1-F