o
    Aed1                     @   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mZ ddlmZ dd	lmZ d
d ZG dd deZG dd deZG dd deZdS )z/
An experimental support for curvilinear grid.
    N)chain)Path)Affine2DIdentityTransform   )_FixedAxisArtistHelperBase_FloatingAxisArtistHelperBase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   p/home/www/facesmatcher.com/pyenv/lib/python3.10/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u 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   1   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      |j S r$   	transDatar&   r   r   r   get_tick_transformC      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-   r0   r/   r   T)minor)	r   get_ylimget_xlimr    r   get_tick_iteratorr   r   iter)r!   r'   v1v2r    gZti1Zti2r   r   r   get_tick_iteratorsF   s   z(FixedAxisArtistHelper.get_tick_iteratorsr$   )	__name__
__module____qualname____doc__r   r%   r+   r9   __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   rA   axis_directionr"   r   r   r   V   s
   
z!FloatingAxisArtistHelper.__init__c                 C   s,   |d u rt j }|d u rt j}||f| _d S r$   )r   rB   rC   )r!   e1e2r   r   r   set_extremesa   s
   z%FloatingAxisArtistHelper.set_extremesc              	   C   s~  | j | | \}}| \}}| j j}||j||||}|\}}	}
}| j\}}| jdkr;t	||
}
t
||}n| jdkrJt	||}t
||	}	|||	\}}}||
|\}}}| jdkrzt| j| j}t|
|| j}|||\}}n| jdkrt||	| 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%   r3   r2   grid_finderextreme_finderZinv_transform_xyrC   r   maxmingrid_locator1grid_locator2r   fullrD   rA   ZlinspaceZtransform_xyZasarraytick_formatter1tick_formatter2
_grid_info)r!   r'   x1x2y1y2rO   rI   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yy0xxyyr   r   r   r%   h   sL   










z#FloatingAxisArtistHelper.update_limc                 C      t  S r$   )r   r&   r   r   r   get_axislabel_transform   r,   z0FloatingAxisArtistHelper.get_axislabel_transformc                    s    fdd}j d \}}}}jdkrj}|| d }njdkr-|| d }j}t|||||f||f\}	}
} j |	}d|d   krPdkrxn dS d|d   kr_dkrxn dS ||
gj }|	ttj	|d d d  fS dS )	Nc                    s"   j j  j }|| |gjS r$   )r   rO   get_transformr*   	transformTxyZtrfr'   r!   r   r   trf_xy   s   z@FloatingAxisArtistHelper.get_axislabel_pos_angle.<locals>.trf_xyrI   r      r   r   )NN)
rX   r   rA   r   	transAxesinvertedrj   r   rad2degarctan2)r!   r'   rp   ZxminZxmaxZyminZymaxrc   rd   Zxy1Zdxy1_dxZdxy1_dypdr   ro   r   get_axislabel_pos_angle   s&   


z0FloatingAxisArtistHelper.get_axislabel_pos_anglec                 C   rg   r$   )r   r&   r   r   r   r+      r,   z+FloatingAxisArtistHelper.get_tick_transformc                    s  j d \}}}|| }j d \}}}|| }	j\}
}fdd}jdkrR|
|k||k@ }t|j|| tj tjf|
|f\\\}}\}}j d n-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_labelrK   rJ   c                    s,   j j  j }|tt| |jS r$   )	r   rO   ri   r*   rj   r   column_stackZbroadcast_arraysrk   rl   ro   r   r   rp      s   z;FloatingAxisArtistHelper.get_tick_iterators.<locals>.trf_xyr   rM   r   rL   c                 S   s   g | ]\}}|r|qS r   r   ).0lmr   r   r   
<listcomp>   s    z?FloatingAxisArtistHelper.get_tick_iterators.<locals>.<listcomp>rq   )r   r   c                  3   sl    t  D ]*\} }}}}| |f}|d r3|d r3| |ggt||g|R V  q	d S )Nr   r   )ziprj   r   rt   )rm   rn   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)rX   rC   r   r   rA   r   rB   r~   ru   pir+   rr   	functoolspartialmplZ
transformsZ_interval_contains_closer5   )r!   r'   r`   ra   rb   rd   r]   r^   r_   rc   Ze0rF   rp   maskZdxx1Zdyy1Zdxx2Zdyy2mmr   r   )	r   r   r'   r   r   r!   r   r   r   r   r9      s:   



z+FloatingAxisArtistHelper.get_tick_iteratorsc                 C   r(   r$   r)   r&   r   r   r   get_line_transform   r,   z+FloatingAxisArtistHelper.get_line_transformc                 C   s*   |  | | jd \}}tt||gS )NrN   )r%   rX   r   r   ry   )r!   r'   rm   rn   r   r   r   get_line   s   
z!FloatingAxisArtistHelper.get_liner$   )r:   r;   r<   r   rH   r%   rh   rx   r+   r9   r   r   r>   r   r   r"   r   r?   T   s    +0r?   c                       sn   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  
        Parameters
        ----------
        aux_trans : `.Transform` or tuple[Callable, Callable]
            The transform from curved coordinates to rectilinear coordinate:
            either a `.Transform` instance (which provides also its inverse),
            or a pair of callables ``(trans, inv_trans)`` that define the
            transform and its inverse.  The callables should have signature::

                x_rect, y_rect = trans(x_curved, y_curved)
                x_curved, y_curved = inv_trans(x_rect, y_rect)

        extreme_finder

        grid_locator1, grid_locator2
            Grid locators for each axis.

        tick_formatter1, tick_formatter2
            Tick formatters for each axis.
        N)r   r   rX   r   rO   )r!   	aux_transrP   rS   rT   rV   rW   r"   r   r   r      s   

zGridHelperCurveLinear.__init__c                 K   s0   |d ur
| j | | j jdi | d | _d S )Nr   )rO   Zupdate_transformupdateZ_old_limits)r!   r   kwargsr   r   r   update_grid_finder  s   
z(GridHelperCurveLinear.update_grid_finderc                 C   s:   |d u r| j }|d u r|}t| ||d}t|||d}|S )N)r   )rE   )r'   r   r
   )r!   r   r   rE   offsetr'   helperaxisliner   r   r   new_fixed_axis  s   z$GridHelperCurveLinear.new_fixed_axisr/   c                 C   sF   |d u r| j }t| |||}t||}|jd |j|j j |S )NT)r'   r?   r
   lineZset_clip_onZset_clip_boxZbbox)r!   r   rA   r'   rE   r   r   r   r   r   new_floating_axis   s   
z'GridHelperCurveLinear.new_floating_axisc                 C   s   | j ||||| _d S r$   )rO   Zget_grid_inforX   )r!   rY   r[   rZ   r\   r   r   r   _update_grid0  s   z"GridHelperCurveLinear._update_gridmajorbothc                 C   sT   g }|dv r| j d d D ]}|| q|dv r(| j d d D ]}|| q |S )N)r   rm   lonlines)r   rn   lat)rX   extend)r!   whichZaxisZ
grid_linesglr   r   r   get_gridlines3  s   z#GridHelperCurveLinear.get_gridlinesFc           
      c   s    t ddddd| }ddg| }|s8t| j| d | | j| d | D ]\\}}}|}	||	||fV  q&d S t| j| d | | j| d | D ]\\}}}|}	||	|dfV  qKd S )	NZ   r   )r.   r-   r/   r0   r   r   Z	tick_locsZtick_labels )dictr~   rX   )
r!   r   Z	axis_sider1   r   Z
lon_or_latZxyar{   r   r   r   r   r4   =  s$   z'GridHelperCurveLinear.get_tick_iterator)NNNNNr$   )NNNN)Nr/   )r   r   )F)r:   r;   r<   r   r   r   r   r   r   r4   r>   r   r   r"   r   r      s&    
#



r   )r=   r   	itertoolsr   numpyr   Z
matplotlibr   Zmatplotlib.pathr   Zmatplotlib.transformsr   r   Z	axislinesr   r   r	   Zaxis_artistr
   rO   r   r   r   r?   r   r   r   r   r   <module>   s    ( 