
    
3j4                         S r SSKrSSKrSSKrSSKJr  SSKJ	r	J
r
Jr  SSKJrJrJr  SSKJr  SSKJr  S	 r " S
 S\5      r " S S\5      r " S S\5      rg)z/
An experimental support for curvilinear grid.
    N)Path)Affine2DBboxIdentityTransform   )_FixedAxisArtistHelperBase_FloatingAxisArtistHelperBaseGridHelperBase)
AxisArtist)
GridFinderc                 z  ^ ^^^^ [         R                  " [         R                  " T5      [         R                  " T5      5      mT " TT5      n[         R                  " [        5      R
                  S-  mU4S jnU" TU5      u  pxU" TU5      u  pU4S jnU" U UU4S jTXxU	5      nU" U UU4S jTXU5      nX\U4$ )a  
Parameters
----------
func : callable
    A function that transforms the coordinates of a point (x, y) to a new coordinate
    system (u, v), and which can also take x and y as arrays of shape *shape* and
    returns (u, v) as a ``(2, shape)`` array.
xs, ys : array-likes
    Points where *func* and its derivatives will be evaluated.
xlim, ylim : pairs of floats
    (min, max) beyond which *func* should not be evaluated.

Returns
-------
val
    Value of *func* at each point of ``(xs, ys)``.
thetas_dx
    Angles (in radians) defined by the (u, v) components of the numerically
    differentiated df/dx vector, at each point of ``(xs, ys)``.  If needed, the
    differentiation step size is increased until at least one component of df/dx
    is nonzero, under the constraint of not going out of the *xlims*, *ylims*
    bounds.  If the gridline at a point is actually null (and the angle is thus not
    well defined), the derivatives are evaluated after taking a small step along y;
    this ensures e.g. that the tick at r=0 on a radial axis of a polar plot is
    parallel with the ticks at r!=0.
thetas_dy
    Like *thetas_dx*, but for df/dy.
g      ?c                    > [        U5      u  p#X-
  nX0-
  n[        R                  " XE5      n[        R                  " XT:  SS5      [        R                  " TU5      -  nXv4$ )Nr   )sortednpmaximumwhereminimum)	valslimlohidlodhieps_maxepseps0s	           i/home/wildlama/miniconda3/lib/python3.13/site-packages/mpl_toolkits/axisartist/grid_helper_curvelinear.pycalc_eps&_value_and_jac_angle.<locals>.calc_eps7   sV    ii**S&hhsz1b)BJJtW,EE|    c                   > [         R                  " T[         R                  5      n[         R                  " TS5      nUn[        SU/5       H  u  pUR	                  5       (       d  M  [        U5      U:  R	                  5       (       d  M?  US:X  a  US:  R	                  5       (       a  M_  [         R                  " Xs5      nU " Xt5      U " SU5      -
  U-  u  pXiS:g  U
S:g  -  -  n[         R                  " X5      U   X['   Xk) -  nUS-  nUR	                  5       (       d  M  [        U5      U:  R	                  5       (       a  M  M     U$ )NTr   r      )r   fullnan	enumerateanyabsr   arctan2)dfuncpseps_p0r   eps_q	thetas_dpmissingeps_pitdf_xdf_ygoodshapes               r   calc_thetas)_value_and_jac_angle.<locals>.calc_thetasB   s   GGE266*	''%&"Au:.IB++--SZ'%9$>$>$@$@7	00

52#E1E!UOCuL
19";<"$**T"8">	5 
 ++--SZ'%9$>$>$@$@ / r!   c                 "   > T" TU -   TU-   5      $ N r0   r-   funcxsyss     r   <lambda>&_value_and_jac_angle.<locals>.<lambda>R       b5j"u*1Mr!   c                 "   > T" TU-   TU -   5      $ r9   r:   r;   s     r   r?   r@   T   rA   r!   )r   broadcast_shapesr5   finfofloatr   )r<   r=   r>   xlimylimvalr   xepsxeps_maxyepsyeps_maxr6   	thetas_dx	thetas_dyr   r5   s   ```           @@r   _value_and_jac_anglerO      s    < bhhrl;E
r2,C 88E?3'D b$'NDb$'ND  M6IM6II&&r!   c                   B   ^  \ rS rSrSrSU 4S jjrS rS rS rSr	U =r
$ )	FixedAxisArtistHelperY   z 
Helper class for a fixed axis.
c                 b   > [         TU ]  US9  Xl        Uc  U R                  nX0l        X l        g)e
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)selfrX   r[   rZ   	__class__s       r   rW   FixedAxisArtistHelper.__init__^   s5     	T"&""nnO.	r!   c                 :    U R                   R                  U5        g r9   )rX   
update_limr\   axess     r   r`    FixedAxisArtistHelper.update_limm   s    ##D)r!   c                     UR                   $ r9   	transDatara   s     r   get_tick_transform(FixedAxisArtistHelper.get_tick_transformp       ~~r!   c                 
  ^ ^^ T R                   S:X  a  UR                  5       OUR                  5       u  p#X#:  a  SSSSS.T R                     mOT R                  m[	        SSSSS9T   mUU U4S	 jnU" 5       [        / 5      4$ )
z tick_loc, tick_angle, tick_labelr   rightleftbottomtop)rl   rk   rn   rm   Z   )rl   rk   rm   rn   c               3      >#    TR                   S4STR                   -
  S44 HL  u  pTR                  R                  SS/U       nUS   T    H  n/ US   QTPU(       a  US   OS	P7v   M     MN     g 7f)
NTr   FlonlatticksrU   label )rZ   rX   
_grid_info)rY   show_labelsgitickangle_tangentr\   r[   s       r   
iter_major<FixedAxisArtistHelper.get_tick_iterators.<locals>.iter_major~   s     ))401t7K7K3KU2S+U&	%%00%	1JKwK-DCDK C C-8DMbC C .+Us   A1A4)rY   get_ylimget_xlimr[   dictiter)r\   rb   v1v2r{   rz   r[   s   `    @@r   get_tick_iterators(FixedAxisArtistHelper.get_tick_iteratorss   s    $(NNa$7T]]_7#f#u66:iiAD 99D"Bqa@F	C |T"X%%r!   )rX   rZ   r[   r9   )__name__
__module____qualname____firstlineno____doc__rW   r`   rg   r   __static_attributes____classcell__r]   s   @r   rQ   rQ   Y   s!    *& &r!   rQ   c                   \   ^  \ rS rSrSU 4S jjrS rS rS rS rS r	S r
S	 rS
 rSrU =r$ )FloatingAxisArtistHelper   c                    > [         TU ]  X#5        X0l        Xl        [        R
                  * [        R
                  4U l        SU l        g)rT   d   N)rV   rW   valuerX   r   inf	_extremes_line_num_points)r\   rX   rY   r   axis_directionr]   s        r   rW   !FloatingAxisArtistHelper.__init__   s:    
 	*
&&&"&& #r!   c                 b    Uc  [         R                  * nUc  [         R                  nX4U l        g r9   )r   r   r   )r\   e1e2s      r   set_extremes%FloatingAxisArtistHelper.set_extremes   s)    :&&B:Br!   c           
         U R                   R                  U5        UR                  5       u  p#UR                  5       u  pEU R                   R                  nUR
                  R                  UR                  5       R                  5       [        R                  " X$X55      5      nUR                  u  ppU R                  u  pU R                  S:X  a  [        X5      n	[        X5      nO&U R                  S:X  a  [        X5      n[        X5      n
UR!                  X5      u  pnUR#                  X5      u  nnnU R                  S:X  a~  UR                  5       R%                  [&        R(                  " [&        R*                  " U R,                  U R.                  5      [&        R0                  " XU R,                  5      /5      5      nOU R                  S:X  a}  UR                  5       R%                  [&        R(                  " [&        R0                  " XU R,                  5      [&        R*                  " U R,                  U R.                  5      /5      5      n[        R                  " XX5      X[&        R2                  " U5      4UU[&        R2                  " U5      4UR5                  SSUU5      UR5                  SSUU5      WS.U l        g )Nr   r   rm   r#   )extremeslon_infolat_info
lon_labels
lat_labelsline_xy)rX   r`   r~   r}   grid_finderextreme_finder_find_transformed_bboxget_transforminvertedr   from_extentsextentsr   rY   maxmingrid_locator1grid_locator2	transformr   column_stackr$   r   r   linspaceasarray_format_ticksrv   )r\   rb   x1x2y1y2r   tbboxlon_minlat_minlon_maxlat_maxe_mine_maxlon_levslon_n
lon_factorlat_levslat_n
lat_factorxyss                        r   r`   #FloatingAxisArtistHelper.update_lim   s9   ##D)&&22**AA%%'002D4E4Ebb4UW .3]]*'~~>>Q%)G%)G^^q %)G%)G&1&?&?&Q#&1&?&?&Q#%>>Q++-77--tzz:Gd.C.CDI 9 C ^^q ++-77Gd.C.CD--tzz:I 9 C ))'GM!"**Z*@A!5"**Z*@A%338Z3%338Z3	
r!   c                     [        5       $ r9   )r   ra   s     r   get_axislabel_transform0FloatingAxisArtistHelper.get_axislabel_transform   s
    zr!   c                   ^ ^ UU 4S jnT R                   S   R                  u  p4pVT R                  S:X  a  T R                  nXF-   S-  nO#T R                  S:X  a  X5-   S-  nT R                  n[	        UWWX54XF45      u  pnTR
                  R                  5       R                  U	5      nSUS   s=::  a  S::  a<  O  gSUS   s=::  a  S::  a)  O  gU	[        R                  " X/T R                     5      4$ g)Nc                    > TR                   R                  R                  5       TR                  -   nUR	                  X/5      R
                  $ r9   )rX   r   r   rf   r   Txytrfrb   r\   s      r   trf_xy@FloatingAxisArtistHelper.get_axislabel_pos_angle.<locals>.trf_xy   s=    ""..<<>OC==!(***r!   r   r   r#   r   )NN)
rv   r   rY   r   rO   	transAxesr   r   r   rad2deg)r\   rb   r   xminyminxmaxymaxxx0yy0xy1angle_dxangle_dyps   ``           r   get_axislabel_pos_angle0FloatingAxisArtistHelper.get_axislabel_pos_angle   s    	+ "&!<!D!DD>>Q**C;!#C^^q ;!#C**C"6CtlTL#:xNN##%//4!>>   1Q4n1n  

H#7#GHHHr!   c                     [        5       $ r9   )r   ra   s     r   rg   +FloatingAxisArtistHelper.get_tick_transform   s     ""r!   c                 v  ^ ^^^^^^^^ T R                   S   u  p#nX$-  nT R                   S   u  pgnXh-  n	T R                  u  pUU 4S jnT R                  S:X  a[  X:*  X[:*  -  n[        UT R                  X]   [
        R                  * [
        R                  4X45      u  u  mmmmT R                   S   mOjT R                  S:X  aZ  X:*  X:*  -  n[        XU   T R                  [
        R                  * [
        R                  4X45      u  u  mmmmT R                   S   m[        TW5       VVs/ s H  u  pU(       d  M  UPM     snnmT R                  T5      TR                  -
  m[        R                  " [        R                  R                  S5      mUUUUUUU4S	 jnU" 5       [        / 5      4$ s  snnf )
z9tick_loc, tick_angle, tick_label, (optionally) tick_labelr   r   c                    > TR                   R                  R                  5       TR                  -   nUR	                  [
        R                  " [
        R                  " X5      5      5      R                  $ r9   )	rX   r   r   rf   r   r   r   broadcast_arraysr   r   s      r   r   ;FloatingAxisArtistHelper.get_tick_iterators.<locals>.trf_xy   sO    ""..<<>OC==1D1DQ1J!KLNNNr!   r   r   r   r   )r   r   c               3      >#    [        TTTTT	5       H]  u  pp#nT
R                  X45      nT" US   5      (       d  M+  T" US   5      (       d  M=  X//[        R                  " X#/5      QUP7v   M_     g 7f)Nr   r   )zipr   r   r   )r   r   normaltangentlabc2angle_normalrz   in_01labelstick_to_axesxx1yy1s         r   r{   ?FloatingAxisArtistHelper.get_tick_iterators.<locals>.iter_major  ss     3\=&I +fs!++QF3A<<E"Q%LL&E2::v.?#@E#EE Js   7A5A5%A5)rv   r   rY   rO   r   r   r   r   rg   r   	functoolspartialmpl
transforms_interval_contains_closer   )r\   rb   r   r   r   r   r   r   r   r   e0r   r   masklmr{   r   rz   r   r   r   r   r   s   ``               @@@@@@@r   r   +FloatingAxisArtistHelper.get_tick_iterators   s    '+ooj&A##&*ooj&A##	O
 >>QI#),D6J

CI/@2(7L3JS#m__\2F^^q I#),D6JD	4::/@2(7L3JS#|__\2F #FD 17 1Q! 17..t4t~~E!!NN33V=	F 	F |T"X%% 8s   /F5 F5c                     UR                   $ r9   re   ra   s     r   get_line_transform+FloatingAxisArtistHelper.get_line_transform  ri   r!   c                 T    U R                  U5        [        U R                  S   5      $ )Nr   )r`   r   rv   ra   s     r   get_line!FloatingAxisArtistHelper.get_line  s"    DOOI.//r!   )r   rv   r   rX   r   r9   )r   r   r   r   rW   r   r`   r   r   rg   r   r   r  r   r   r   s   @r   r   r      s7    	$ )
V(#(&T0 0r!   r   c                   n   ^  \ rS rSr     SU 4S jjrSS jrSSSSS.S jrSS jrS rSS	 jr	S
r
U =r$ )GridHelperCurveLineari  Nc                 Z   > [         TU ]  5         SU l        [        UUUUUU5      U l        g)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)rV   rW   rv   r   r   )r\   	aux_transr   r   r   tick_formatter1tick_formatter2r]   s          r   rW   GridHelperCurveLinear.__init__  s5    4 	%i&4&3&3&5&57r!   c                     Ub  U R                   R                  U5        U R                   R                  " S0 UD6  S U l        g )Nr:   )r   update_transformupdate_old_limits)r\   r  kwargss      r   update_grid_finder(GridHelperCurveLinear.update_grid_finder8  s;     --i8)&)r!   )r   offsetrb   rY   c                V    Uc  U R                   nUc  Un[        XUS9n[        XFUS9nU$ )N)rZ   )r   )rb   rQ   r   )r\   rU   r   r  rb   rY   helperaxislines           r   new_fixed_axis$GridHelperCurveLinear.new_fixed_axis>  s<     <99D! N&t)Ld>J r!   c                     Uc  U R                   n[        XX$5      n[        X55      nUR                  R	                  S5        UR                  R                  UR                   R                  5        U$ )NT)rb   r   r   lineset_clip_onset_clip_boxbbox)r\   rY   r   rb   r   r  r  s          r   new_floating_axis'GridHelperCurveLinear.new_floating_axisK  s^    <99D)U4d+!!$'""8==#5#56 r!   c                 D    U R                   R                  U5      U l        g r9   )r   get_grid_inforv   )r\   r  s     r   _update_grid"GridHelperCurveLinear._update_gridW  s    **88>r!   c                 "   / nUS;   a;  UR                  U R                  S   S    Vs/ s H  oDR                  PM     sn5        US;   a;  UR                  U R                  S   S    Vs/ s H  oDR                  PM     sn5        U$ s  snf s  snf )N)bothr   rq   lines)r$  r   rr   )extendrv   r   )r\   whichaxis
grid_linesgls        r   get_gridlines#GridHelperCurveLinear.get_gridlinesZ  s    
= dooe.DW.MN.Mtt.MNO= dooe.DW.MN.Mtt.MNO ONs   B)B)rv   r  r   )NNNNNr9   )Nrm   )majorr$  )r   r   r   r   rW   r  r  r  r!  r+  r   r   r   s   @r   r  r    sA     $##!%!%!7F  &*$TT
? r!   r  )r   r   numpyr   
matplotlibr   matplotlib.pathr   matplotlib.transformsr   r   r   	axislinesr   r	   r
   axis_artistr   r   r   rO   rQ   r   r  r:   r!   r   <module>r4     sc         C CO O # #D'N-&6 -&`H0< H0VLN Lr!   