U
    Âmœd¶1  ã                   @   s¬   d Z ddlZddlmZ ddlZddlZddlm	Z	 ddl
mZmZ ddlmZmZ ddlmZ dd	lmZ d
d„ ZG dd„ dejƒZG dd„ dejƒZG dd„ deƒZdS )z/
An experimental support for curvilinear grid.
é    N)Úchain)ÚPath)ÚAffine2DÚIdentityTransformé   )ÚAxisArtistHelperÚGridHelperBase)Ú
AxisArtist)Ú
GridFinderc                 C   sØ   t  t¡jd }| ||ƒ}t|ƒ\}}|| }	|| }
t  ddg|
|	k¡t  |t  |	|
¡¡ }| || |ƒ}t|ƒ\}}|| }|| }t  ddg||k¡t  |t  ||¡¡ }| ||| ƒ}||| | || | fS )zÈ
    Compute *func* and its derivatives along x and y at positions *xs*, *ys*,
    while ensuring that finite difference calculations don't try to evaluate
    values outside of *xlims*, *ylims*.
    g      à?éÿÿÿÿr   )ÚnpZfinfoÚfloatÚepsÚsortedZtakeÚminimumÚmaximum)ÚfuncZxsZysZxlimsZylimsr   ÚvalZxloZxhiZdxloZdxhiZxepsZval_dxZyloZyhiZdyloZdyhiZyepsZval_dy© r   úh/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/mpl_toolkits/axisartist/grid_helper_curvelinear.pyÚ_value_and_jacobian   s"    
ÿÿr   c                       s:   e Zd ZdZd‡ fdd„	Zdd„ Zdd„ Zd	d
„ Z‡  ZS )ÚFixedAxisArtistHelperz(
    Helper class for a fixed axis.
    Nc                    s2   t ƒ j|d� || _|dkr"| j}|| _|| _dS )ú}
        nth_coord = along which coordinate value varies.
         nth_coord = 0 ->  x axis, nth_coord = 1 -> y axis
        )ÚlocN)ÚsuperÚ__init__Úgrid_helperÚ	nth_coordÚnth_coord_ticksÚside)Úselfr   r   r   ©Ú	__class__r   r   r   0   s    zFixedAxisArtistHelper.__init__c                 C   s   | j  |¡ d S ©N)r   Ú
update_lim©r    Úaxesr   r   r   r$   ?   s    z FixedAxisArtistHelper.update_limc                 C   s   |j S r#   ©Ú	transDatar%   r   r   r   Úget_tick_transformB   s    z(FixedAxisArtistHelper.get_tick_transformc                 C   s~   | j dkr| ¡ n| ¡ \}}||kr<dddddœ| j }n| j}| j}| | j|¡}|jd| j |dd	�}t||ƒtg ƒfS )
z tick_loc, tick_angle, tick_labelr   ÚrightÚleftÚbottomÚtop)r+   r*   r-   r,   r   T)Úminor)	r   Úget_ylimÚget_xlimr   r   Úget_tick_iteratorr   r   Úiter)r    r&   Zv1Zv2r   ÚgZti1Zti2r   r   r   Úget_tick_iteratorsE   s     ÿÿz(FixedAxisArtistHelper.get_tick_iterators)N)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r$   r)   r4   Ú__classcell__r   r   r!   r   r   +   s
   r   c                       s^   e Zd Zd‡ fdd„	Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Z‡  ZS )ÚFloatingAxisArtistHelperNc                    s4   t ƒ  ||¡ || _|| _tj tjf| _d| _dS )r   éd   N)r   r   Úvaluer   r   ÚinfÚ	_extremesÚ_line_num_points)r    r   r   r<   Úaxis_directionr!   r   r   r   T   s
    z!FloatingAxisArtistHelper.__init__c                 C   s,   |d krt j }|d krt j}||f| _d S r#   )r   r=   r>   )r    Úe1Úe2r   r   r   Úset_extremes_   s
    z%FloatingAxisArtistHelper.set_extremesc              	   C   s€  | j  |¡ | ¡ \}}| ¡ \}}| j j}| |j||||¡}|\}}	}
}| j\}}| jdkrvt	||
ƒ}
t
||ƒ}n| jdkr”t	||ƒ}t
||	ƒ}	| ||	¡\}}}| |
|¡\}}}| jdkrôt | j| j¡}t |
|| j¡}| ||¡\}}n<| jdk�r0t ||	| j¡}t | j| j¡}| ||¡\}}||	|
|f||t |¡f||t |¡f| d||¡| d||¡||fdœ| _d S )Nr   r   r,   )ÚextremesÚlon_infoÚlat_infoÚ
lon_labelsÚ
lat_labelsÚline_xy)r   r$   r0   r/   Úgrid_finderÚextreme_finderZinv_transform_xyr>   r   ÚmaxÚminÚgrid_locator1Úgrid_locator2r   Úfullr?   r<   ZlinspaceZtransform_xyZasarrayÚtick_formatter1Útick_formatter2Ú
_grid_info)r    r&   Úx1Úx2Úy1Úy2rJ   rD   Zlon_minZlon_maxZlat_minZlat_maxZe_minZe_maxÚlon_levsÚlon_nÚ
lon_factorÚlat_levsÚlat_nÚ
lat_factorÚxx0Úyy0ZxxÚyyr   r   r   r$   f   sZ       ÿ






ÿ
ÿ

  ÿ  ÿøz#FloatingAxisArtistHelper.update_limc                 C   s   t ƒ S r#   )r   r%   r   r   r   Úget_axislabel_transform‘   s    z0FloatingAxisArtistHelper.get_axislabel_transformc                    sô   ‡ ‡fdd„}ˆj d \}}}}ˆjdkr>ˆj}|| d }nˆjdkrZ|| d }ˆj}t|||||f||fƒ\}	}
}ˆ j ¡  |	¡}d|d   kr dkrìn nHd|d   kr¼dkrìn n,||
gˆj }|	t tj	|d d d… Ž ¡fS dS d S )	Nc                    s"   ˆj j ¡ ˆ j }| | |g¡jS r#   )r   rJ   Úget_transformr(   Ú	transformÚT©ÚxÚyZtrf©r&   r    r   r   Útrf_xy•   s    z@FloatingAxisArtistHelper.get_axislabel_pos_angle.<locals>.trf_xyrD   r   é   r   r   )NN)
rS   r   r<   r   Ú	transAxesÚinvertedrc   r   Úrad2degÚarctan2)r    r&   ri   ZxminZxmaxZyminZymaxr^   r_   Zxy1Zdxy1_dxZdxy1_dyÚpÚdr   rh   r   Úget_axislabel_pos_angle”   s(    

    ÿ
8z0FloatingAxisArtistHelper.get_axislabel_pos_anglec                 C   s   t ƒ S r#   )r   r%   r   r   r   r)   ©   s    z+FloatingAxisArtistHelper.get_tick_transformc                    s–  ˆj d \}}}|| }ˆj d \}}}|| }	ˆj\}
}‡‡fdd„}ˆjdkr¤|
|k||k@ }t|ˆj|| tj tjf|
|fƒ\\‰‰\}}\}}ˆj d ‰nZˆjdkrþ|
|	k|	|k@ }t||	| ˆjtj 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_labelrF   rE   c                    s,   ˆj j ¡ ˆ j }| t t | |¡¡¡jS r#   )	r   rJ   rb   r(   rc   r   Úcolumn_stackZbroadcast_arraysrd   re   rh   r   r   ri   ·   s    z;FloatingAxisArtistHelper.get_tick_iterators.<locals>.trf_xyr   rH   r   rG   c                 S   s   g | ]\}}|r|‘qS r   r   )Ú.0ÚlÚmr   r   r   Ú
<listcomp>È   s      z?FloatingAxisArtistHelper.get_tick_iterators.<locals>.<listcomp>rj   )r   r   c                  3   sh   t ˆˆˆ ˆˆƒD ]R\} }}}}ˆ | |f¡}ˆ|d ƒrˆ|d ƒr| |gft ||g¡|f˜V  qd S )Nr   r   )Úziprc   r   rm   )rf   rg   ÚnormalZtangentZlabÚc2)Úangle_normalÚangle_tangentÚin_01ÚlabelsÚtick_to_axesÚxx1Úyy1r   r   Úf1Ó   s
    ÿz7FloatingAxisArtistHelper.get_tick_iterators.<locals>.f1)rS   r>   r   r   r<   r   r=   rw   rn   Úpir)   rk   Ú	functoolsÚpartialÚmplZ
transformsZ_interval_contains_closer2   )r    r&   r[   r\   r]   r_   rX   rY   rZ   r^   Ze0rA   ri   ÚmaskZdxx1Zdyy1Zdxx2Zdyy2Úmmr�   r   )	rz   r{   r&   r|   r}   r    r~   r   r€   r   r4   ¬   sL    

    ÿ
    ÿ
 ÿz+FloatingAxisArtistHelper.get_tick_iteratorsc                 C   s   |j S r#   r'   r%   r   r   r   Úget_line_transformÜ   s    z+FloatingAxisArtistHelper.get_line_transformc                 C   s*   |   |¡ | jd \}}tt ||g¡ƒS )NrI   )r$   rS   r   r   rr   )r    r&   rf   rg   r   r   r   Úget_lineß   s    
z!FloatingAxisArtistHelper.get_line)N)r5   r6   r7   r   rC   r$   ra   rq   r)   r4   rˆ   r‰   r9   r   r   r!   r   r:   S   s   +0r:   c                       sX   e Zd Zd‡ fdd„	Zddd„Zddd„Zdd	d
„Zdd„ Zddd„Zddd„Z	‡  Z
S )ÚGridHelperCurveLinearNc                    s.   t ƒ  ¡  d| _|| _t||||||ƒ| _dS )aÇ  
        aux_trans : a transform from the source (curved) coordinate to
        target (rectilinear) coordinate. An instance of MPL's Transform
        (inverse transform should be defined) or a tuple of two callable
        objects which defines the transform and its inverse. The callables
        need take two arguments of array of source coordinates and
        should return two target coordinates.

        e.g., ``x2, y2 = trans(x1, y1)``
        N)r   r   rS   Z
_aux_transr
   rJ   )r    Ú	aux_transrK   rN   rO   rQ   rR   r!   r   r   r   æ   s    
ûzGridHelperCurveLinear.__init__c                 K   s,   |d k	r| j  |¡ | j jf |Ž d | _d S r#   )rJ   Zupdate_transformÚupdateZ_old_limits)r    r‹   Úkwargsr   r   r   Úupdate_grid_finder   s    z(GridHelperCurveLinear.update_grid_finderc                 C   s:   |d kr| j }|d kr|}t| ||d�}t|||d�}|S )N)r   )r@   )r&   r   r	   )r    r   r   r@   Úoffsetr&   Ú_helperÚaxisliner   r   r   Únew_fixed_axis  s    z$GridHelperCurveLinear.new_fixed_axisr,   c                 C   sF   |d kr| j }t| |||ƒ}t||ƒ}|j d¡ |j |j j¡ |S )NT)r&   r:   r	   ÚlineZset_clip_onZset_clip_boxZbbox)r    r   r<   r&   r@   r�   r‘   r   r   r   Únew_floating_axis  s       ÿ
	z'GridHelperCurveLinear.new_floating_axisc                 C   s   | j  ||||¡| _d S r#   )rJ   Zget_grid_inforS   )r    rT   rV   rU   rW   r   r   r   Ú_update_grid1  s    z"GridHelperCurveLinear._update_gridÚmajorÚbothc                 C   sT   g }|dkr*| j d d D ]}| |¡ q|dkrP| j d d D ]}| |¡ q@|S )N)r—   rf   ÚlonÚlines)r—   rg   Úlat)rS   Úextend)r    ÚwhichZaxisZ
grid_linesÚglr   r   r   Úget_gridlines4  s    z#GridHelperCurveLinear.get_gridlinesFc           
      c   s¶   t ddddd�| }ddg| }|slt| j| d | | j| d | ƒD ]\\}}}|}	||	||fV  qJnFt| j| d | | j| d | ƒD ]\\}}}|}	||	|dfV  q’d S )	NéZ   r   )r+   r*   r,   r-   r˜   rš   Z	tick_locsZtick_labelsÚ )Údictrw   rS   )
r    r   Z	axis_sider.   r{   Z
lon_or_latZxyÚart   rz   r   r   r   r1   >  s    þþz'GridHelperCurveLinear.get_tick_iterator)NNNNN)N)NNNN)Nr,   )r–   r—   )F)r5   r6   r7   r   rŽ   r’   r”   r•   rž   r1   r9   r   r   r!   r   rŠ   å   s$        û
    ü
  ý


rŠ   )r8   rƒ   Ú	itertoolsr   Únumpyr   Z
matplotlibr…   Zmatplotlib.pathr   Zmatplotlib.transformsr   r   Z	axislinesr   r   Zaxis_artistr	   rJ   r
   r   ZFixedr   ZFloatingr:   rŠ   r   r   r   r   Ú<module>   s   ( 