U
    Âmœd *  ã                   @   sî   d Z ddlZddlZ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mZ ddlmZ dd	lmZ G d
d„ dejƒZG dd„ dejƒZG dd„ deƒZG dd„ dejƒZG dd„ dƒZe ed¡ZeeejƒƒZeZdS )z/
An experimental support for curvilinear grid.
é    N)Ú_apiÚcbook)ÚPath)Úhost_axes_class_factoryé   )Ú	axislinesÚgrid_helper_curvelinear)Ú
AxisArtist)ÚExtremeFinderSimplec                   @   s   e Zd ZdS )ÚFloatingAxisArtistHelperN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú^/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/mpl_toolkits/axisartist/floating_axes.pyr      s   r   c                       s6   e Zd Zd
‡ fdd„	Zdd„ Zdd„ Zdd	„ Z‡  ZS )ÚFixedAxisArtistHelperNc                    sJ   |  |¡\}}tƒ j||||d� |dkr.|}|| _|| _|| _|| _dS )z}
        nth_coord = along which coordinate value varies.
         nth_coord = 0 ->  x axis, nth_coord = 1 -> y axis
        ©Úaxis_directionN)Úget_data_boundaryÚsuperÚ__init__Únth_coord_ticksÚvalueÚgrid_helperÚ_side)Úselfr   Úsider   r   Ú	nth_coord©Ú	__class__r   r   r      s    zFixedAxisArtistHelper.__init__c                 C   s   | j  |¡ | j j| _d S ©N)r   Ú
update_limÚ
_grid_info)r   Úaxesr   r   r   r!   .   s    z FixedAxisArtistHelper.update_limc                    s¾  | j j‰| jd \}}}|| }| jd \}}}|| }	| j j}
t|
dd… ƒ\}}t|
dd… ƒ\}}‡‡fdd„}| jdkrÎ||k||k@ }t || j|| ||f||f¡\\‰‰\}}\}}| jd ‰nX| jd	k�r&||	k|	|k@ }t ||	| | j||f||f¡\\‰‰\}}\}}| jd
 ‰dd„ t	ˆ|ƒD ƒ‰t
 ||¡‰ t
 ||¡‰|dk|dk@ }ˆ| t
jd  ˆ |< |  ˆ¡ˆj ‰t tjjd¡‰‡ ‡‡‡‡‡‡fdd„}|ƒ tg ƒfS )z9tick_loc, tick_angle, tick_label, (optionally) tick_labelÚlat_infoÚlon_infoNé   c                    s(   ˆ  ¡ ˆ j }| t t | |¡¡¡jS r    )Úget_transformÚ	transDataÚ	transformÚnpÚcolumn_stackZbroadcast_arraysÚT)ÚxÚyZtrf)r#   Úgrid_finderr   r   Útrf_xyA   s    z8FixedAxisArtistHelper.get_tick_iterators.<locals>.trf_xyr   Ú
lat_labelsr   Ú
lon_labelsc                 S   s   g | ]\}}|r|‘qS r   r   )Ú.0ÚlÚmr   r   r   Ú
<listcomp>S   s      z<FixedAxisArtistHelper.get_tick_iterators.<locals>.<listcomp>)r   r   c                  3   sh   t ˆˆˆ ˆˆƒD ]R\} }}}}ˆ | |f¡}ˆ|d ƒrˆ|d ƒr| |gft ||g¡|f˜V  qd S )Nr   r   )Úzipr)   r*   Zrad2deg)r-   r.   ÚnormalZtangentZlabÚc2)Úangle_normalÚangle_tangentÚin_01ÚlabelsÚtick_to_axesÚxx1Úyy1r   r   Úf1^   s
    ÿz4FixedAxisArtistHelper.get_tick_iterators.<locals>.f1)r   r/   r"   Ú	_extremesÚsortedr   r   Z_value_and_jacobianr   r7   r*   Zarctan2ÚpiZget_tick_transformÚ	transAxesÚ	functoolsÚpartialÚmplZ
transformsZ_interval_contains_closeÚiter)r   r#   Úlat_levsÚlat_nÚ
lat_factorZyy0Úlon_levsÚlon_nÚ
lon_factorZxx0ÚextremesÚxminÚxmaxÚyminÚymaxr0   ÚmaskZdxx1Zdyy1Zdxx2Zdyy2ÚmmrA   r   )	r:   r;   r#   r/   r<   r=   r>   r?   r@   r   Úget_tick_iterators2   sV    
    ÿÿ    ÿÿ
 ÿz(FixedAxisArtistHelper.get_tick_iteratorsc                 C   sH   |   |¡ tddddd�| j \}}| j| | \}}tt ||g¡ƒS )N)Ú
lon_lines0r   )rX   r   )Ú
lat_lines0r   )rY   r   ©ÚleftÚrightÚbottomÚtop)r!   Údictr   r"   r   r*   r+   )r   r#   ÚkÚvZxxÚyyr   r   r   Úget_lineg   s    
ýýzFixedAxisArtistHelper.get_line)N)r   r   r   r   r!   rW   rc   Ú__classcell__r   r   r   r   r      s   5r   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚExtremeFinderFixedc                 C   s
   || _ dS )zÚ
        This subclass always returns the same bounding box.

        Parameters
        ----------
        extremes : (float, float, float, float)
            The bounding box that this helper always returns.
        N©rB   )r   rP   r   r   r   r   t   s    	zExtremeFinderFixed.__init__c                 C   s   | j S r    rf   )r   Ztransform_xyÚx1Úy1Úx2Úy2r   r   r   Ú__call__   s    zExtremeFinderFixed.__call__N)r   r   r   r   rk   r   r   r   r   re   q   s   re   c                       sB   e Zd Zd‡ fdd„	Zdd„ Zddd„Zdd	„ Zddd„Z‡  ZS )ÚGridHelperCurveLinearNc                    s*   || _ t|ƒ}tƒ j||||||d� d S )N)Úgrid_locator1Úgrid_locator2Útick_formatter1Útick_formatter2)rB   re   r   r   )r   Z	aux_transrP   rm   rn   ro   rp   Úextreme_finderr   r   r   r   †   s    ûzGridHelperCurveLinear.__init__c                 C   s2   | j \}}}}t|df|df|df|dfd�| S )z$
        Return v=0, nth=1.
        r   r   rZ   )rB   r_   )r   r   Zlon1Zlon2Zlat1Zlat2r   r   r   r   •   s    ýýz'GridHelperCurveLinear.get_data_boundaryc                 C   sV   |d kr| j }|d kr|}t| ||d�}t|||d�}|j d¡ |j |j j¡ |S )N)r   r   T)r#   r   r	   ÚlineZset_clip_onZset_clip_boxÚbbox)r   Úlocr   r   Úoffsetr#   Z_helperZaxisliner   r   r   Únew_fixed_axisŸ   s      ÿz$GridHelperCurveLinear.new_fixed_axisc                 C   s„  | j d krtƒ | _ | j }| j}| |j||||¡}t|d d… ƒ\}}	t|dd … ƒ\}
}||	|
|f|d< | ||	¡\}}}t |¡}| 	|
|¡\}}}t |¡}|||f|d< |||f|d< | 
d||¡|d< | d||¡|d< |d |… | }|d |… | }| |||k ||	k @  ||
|k ||k @  ||	|
|¡\}}||d< ||d	< |j|d d… |dd … f|žŽ \}}||d
< ||d< d S )Nr&   rP   r%   r$   r]   r2   r1   Ú	lon_linesÚ	lat_linesrX   rY   )r"   r_   r/   rq   Zinv_transform_xyrC   rm   r*   Zasarrayrn   ro   rp   Z_get_raw_grid_lines)r   rg   rh   ri   rj   Z	grid_infor/   rP   Zlon_minZlon_maxZlat_minZlat_maxrM   rN   rO   rJ   rK   rL   Z
lon_valuesZ
lat_valuesrw   rx   r   r   r   Ú_update_gridÇ   sf    
   ÿ
ÿ

ÿ
  ÿ  ÿ   ý
 
þþ
z"GridHelperCurveLinear._update_gridÚmajorÚbothc                 C   s8   g }|dkr|  | jd ¡ |dkr4|  | jd ¡ |S )N)r{   r-   rw   )r{   r.   rx   )Úextendr"   )r   ÚwhichZaxisZ
grid_linesr   r   r   Úget_gridlinesö   s    z#GridHelperCurveLinear.get_gridlines)NNNN)NNNN)rz   r{   )	r   r   r   r   r   rv   ry   r~   rd   r   r   r   r   rl   „   s       ü    ü
(/rl   c                       s8   e Zd Z‡ fdd„Zdd„ Z‡ fdd„Zdd„ Z‡  ZS )	ÚFloatingAxesBasec                   s:   t jt|d� tƒ j|d|i|—Ž |  d¡ |  ¡  d S )N)r   r   g      ð?)r   Zcheck_isinstancerl   r   r   Z
set_aspectÚadjust_axes_lim)r   r   ÚargsÚkwargsr   r   r   r     s    
zFloatingAxesBase.__init__c                 C   s`   t |  ¡ jddddgƒ\\}}\}}\}}\}}t ||f||f||f||fg¡}d| ¡ _|S )Nr[   r\   r]   r^   éd   )ÚmapÚget_grid_helperr   ÚmpatchesZPolygonÚget_pathZ_interpolation_steps)r   Zx0Ú_rg   Zy0rh   Úpatchr   r   r   Ú_gen_axes_patch  s    
þ"
z FloatingAxesBase._gen_axes_patchc                    sd   t ƒ  ¡  | j |  ¡ j ¡ | j ¡ t ƒ  ¡ }| 	| j
¡ | | j¡ | j |¡ | j |¡ d S r    )r   Úclearr‰   Zset_transformr…   r/   r'   r(   rŠ   Z
set_figureZfigurerE   Zset_clip_pathZ	gridlines)r   Z
orig_patchr   r   r   r‹     s    
ÿÿ
zFloatingAxesBase.clearc                 C   sL   | j  ¡  | j  ¡ | j ¡}| dd¡}|  |j|j¡ |  	|j
|j¡ d S )NgR¸…ëQð?)r‰   r‡   Zget_extentsr'   r(   ÚexpandedZset_xlimrQ   rR   Zset_ylimrS   rT   )r   rs   r   r   r   r€     s    
þz FloatingAxesBase.adjust_axes_lim)r   r   r   r   rŠ   r‹   r€   rd   r   r   r   r   r   ÿ   s   
r   z
Floating{}) Ú__doc__rF   Únumpyr*   Z
matplotlibrH   r   r   Zmatplotlib.patchesZpatchesr†   Zmatplotlib.pathr   Z%mpl_toolkits.axes_grid1.parasite_axesr   Ú r   r   Zaxis_artistr	   r/   r
   r   r   re   rl   r   Z_make_class_factoryZfloatingaxes_class_factoryZAxesZFloatingAxesZFloatingSubplotr   r   r   r   Ú<module>   s2   
ÿT{( ÿÿ