o
    t d1                     @   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   )npfinfofloatepssortedtakeminimummaximum)funcxsysxlimsylimsr   valxloxhidxlodxhixepsval_dxyloyhidylodyhiyepsval_dy r&   m/var/www/html/jupiter/jupiter/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.   r1   r0   	__class__r&   r'   r-   0   s   
zFixedAxisArtistHelper.__init__c                 C   s   | j | d S N)r.   
update_limr2   axesr&   r&   r'   r6   ?   s   z FixedAxisArtistHelper.update_limc                 C      |j S r5   	transDatar7   r&   r&   r'   get_tick_transformB      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>   rA   r@   r   T)minor)	r/   get_ylimget_xlimr1   r.   get_tick_iteratorr0   r   iter)r2   r8   v1v2r1   gti1ti2r&   r&   r'   get_tick_iteratorsE   s   z(FixedAxisArtistHelper.get_tick_iteratorsr5   )	__name__
__module____qualname____doc__r-   r6   r<   rL   __classcell__r&   r&   r3   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)r2   r.   r/   rT   axis_directionr3   r&   r'   r-   T   s
   
z!FloatingAxisArtistHelper.__init__c                 C   s,   |d u rt j }|d u rt j}||f| _d S r5   )r   rU   rV   )r2   e1e2r&   r&   r'   set_extremes_   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.   r6   rD   rC   grid_finderextreme_finderinv_transform_xyrV   r/   maxmingrid_locator1grid_locator2r   fullrW   rT   linspacetransform_xyasarraytick_formatter1tick_formatter2
_grid_info)r2   r8   x1x2y1y2rb   r\   lon_minlon_maxlat_minlat_maxe_mine_maxlon_levslon_n
lon_factorlat_levslat_n
lat_factorxx0yy0xxyyr&   r&   r'   r6   f   sL   










z#FloatingAxisArtistHelper.update_limc                 C      t  S r5   )r   r7   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 r5   )r.   rb   get_transformr;   	transformTxytrfr8   r2   r&   r'   trf_xy   s   z@FloatingAxisArtistHelper.get_axislabel_pos_angle.<locals>.trf_xyr\   r      r   r   )NN)
ro   r/   rT   r(   	transAxesinvertedr   r   rad2degarctan2)r2   r8   r   xminxmaxyminymaxr   r   xy1dxy1_dxdxy1_dypdr&   r   r'   get_axislabel_pos_angle   s&   


z0FloatingAxisArtistHelper.get_axislabel_pos_anglec                 C   r   r5   )r   r7   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_labelr^   r]   c                    s,   j j  j }|tt| |jS r5   )	r.   rb   r   r;   r   r   column_stackbroadcast_arraysr   r   r   r&   r'   r      s   z;FloatingAxisArtistHelper.get_tick_iterators.<locals>.trf_xyr   r`   r   r_   c                 S   s   g | ]\}}|r|qS r&   r&   ).0lmr&   r&   r'   
<listcomp>   s    z?FloatingAxisArtistHelper.get_tick_iterators.<locals>.<listcomp>r   )r   r   c                  3   sl    t  D ]*\} }}}}| |f}|d r3|d r3| |ggt||g|R V  q	d S )Nr   r   )zipr   r   r   )r   r   normaltangentlabc2)angle_normalangle_tangentin_01labelstick_to_axesxx1yy1r&   r'   f1   s    z7FloatingAxisArtistHelper.get_tick_iterators.<locals>.f1)ro   rV   r/   r(   rT   r   rU   r   r   pir<   r   	functoolspartialmpl
transforms_interval_contains_closerF   )r2   r8   r}   r~   r   r   rz   r{   r|   r   e0rY   r   maskdxx1dyy1dxx2dyy2mmr   r&   )	r   r   r8   r   r   r2   r   r   r   r'   rL      s:   



z+FloatingAxisArtistHelper.get_tick_iteratorsc                 C   r9   r5   r:   r7   r&   r&   r'   get_line_transform   r=   z+FloatingAxisArtistHelper.get_line_transformc                 C   s*   |  | | jd \}}tt||gS )Nra   )r6   ro   r   r   r   )r2   r8   r   r   r&   r&   r'   get_line   s   
z!FloatingAxisArtistHelper.get_liner5   )rM   rN   rO   r-   r[   r6   r   r   r<   rL   r   r   rQ   r&   r&   r3   r'   rR   S   s    +0rR   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  
        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-   ro   
_aux_transr
   rb   )r2   	aux_transrc   rg   rh   rm   rn   r3   r&   r'   r-      s   

zGridHelperCurveLinear.__init__c                 K   s0   |d ur
| j | | j jdi | d | _d S )Nr&   )rb   update_transformupdate_old_limits)r2   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)r0   )rX   )r8   r)   r	   )r2   r+   r/   rX   offsetr8   _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)r8   rR   r	   lineset_clip_onset_clip_boxbbox)r2   r/   rT   r8   rX   r   r   r&   r&   r'   new_floating_axis  s   
	z'GridHelperCurveLinear.new_floating_axisc                 C   s   | j ||||| _d S r5   )rb   get_grid_inforo   )r2   rp   rr   rq   rs   r&   r&   r'   _update_grid1  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   r   lonlines)r   r   lat)ro   extend)r2   whichaxis
grid_linesglr&   r&   r'   get_gridlines4  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@   rA   r   r   	tick_locstick_labels )dictr   ro   )
r2   r/   	axis_siderB   r   
lon_or_latxyar   r   r&   r&   r'   rE   >  s$   z'GridHelperCurveLinear.get_tick_iterator)NNNNNr5   )NNNN)Nr@   )r   r   )F)rM   rN   rO   r-   r   r   r   r   r   rE   rQ   r&   r&   r3   r'   r      s&    




r   )rP   r   	itertoolsr   numpyr   
matplotlibr   matplotlib.pathr   matplotlib.transformsr   r   	axislinesr   r   axis_artistr	   rb   r
   r(   Fixedr)   FloatingrR   r   r&   r&   r&   r'   <module>   s    ( 