a
    f1b3                     @   s   d Z ddlmZ ddlZddlm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 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.
    )chainN)_api)Path)Affine2DIdentityTransform   )AxisArtistHelperGridHelperBase)
AxisArtist)
GridFinderc                       sN   e Zd ZdZd fdd	Zdd Zedd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__ Nlib/python3.9/site-packages/mpl_toolkits/axisartist/grid_helper_curvelinear.pyr      s    zFixedAxisArtistHelper.__init__c                 C   s   | j | d S N)r   
update_limr   axesr   r   r   r   $   s    z FixedAxisArtistHelper.update_lim3.5c                 C   s2   |d u rd| j  | _ n|dv r&|| _ ntdd S )Nr   )r   r   zwrong coord number)r   	Exception)r   Zcoord_numberr   r   r   change_tick_coord'   s
    z'FixedAxisArtistHelper.change_tick_coordc                 C   s   |j S r   	transDatar   r   r   r   get_tick_transform0   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_iterators3   s    z(FixedAxisArtistHelper.get_tick_iterators)N)N)__name__
__module____qualname____doc__r   r   r   Z
deprecatedr    r#   r.   __classcell__r   r   r   r   r      s   r   c                       sh   e Zd Ze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 )FloatingAxisArtistHelperr   Nc                    s4   t  || || _|| _tj tjf| _d| _dS )r   d   N)r   r   valuer   npinf	_extremes_line_num_points)r   r   r   r6   axis_directionr   r   r   r   D   s
    z!FloatingAxisArtistHelper.__init__c                 C   s,   |d u rt j }|d u rt j}||f| _d S r   )r7   r8   r9   )r   e1Ze2r   r   r   set_extremesO   s
    z%FloatingAxisArtistHelper.set_extremesc              	   C   st  | j | | \}}| \}}| j j}||j||||}|\}}	}
}| j\}}| jdkrvt	||
}
t
||}n| jdkrt	||}t
||	}	|||	\}}}||
|\}}}| jdkrt| j| j}t|
|| j}|||\}}n<| jdkr0t||	| j}t| j| j}|||\}}||	|
|f|||f|||f|d|||d||||fd| _d S )Nr   r   r&   )extremeslon_infolat_info
lon_labels
lat_labelsline_xy)r   r   r*   r)   grid_finderextreme_finderZinv_transform_xyr9   r   maxmingrid_locator1grid_locator2r7   Zfullr:   r6   Zlinspacetransform_xytick_formatter1tick_formatter2
_grid_info)r   r   x1x2y1y2rD   r>   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xxZyyr   r   r   r   V   sL    









z#FloatingAxisArtistHelper.update_limc                 C   s   t  S r   )r   r   r   r   r   get_axislabel_transform   s    z0FloatingAxisArtistHelper.get_axislabel_transformc                 C   st  | j d }| jdkrL| j}|d |d  d }d}t|d |d  d }n@| jdkr|d |d  d }| j}t|d |d  d }d}| jj}||g|g\\}\}	|j|j }
|
	||	g}d|d   krdkrln nd|d   krdkrln nj|j	||	g\}}||| g|| g\\}\}|j	||g\}}||ft
t
|| || fS dS d S )Nr>   r         i  r   )NN)rM   r   r6   absr   rD   rJ   r"   	transAxes	transformr7   rad2degarctan2)r   r   r>   rX   rY   ZdxxZdyyrD   xx1yy1Zdata_to_axespZxx1cZyy1cZxx2Zyy2Zxx2cZyy2cr   r   r   get_axislabel_pos_angle   s*    


< "z0FloatingAxisArtistHelper.get_axislabel_pos_anglec                 C   s   t  S r   )r   r   r   r   r   r#      s    z+FloatingAxisArtistHelper.get_tick_transformc                    s:  j jjd \}}}t|}|| }d| }jd \}}}	t|}||	 }
d|	 }j\}}jdkr||k||k@ }|| }n"jdkr||
k|
|k@ }|
| }
 fdd}jdkrbt|j}
||
|\	|
	 }||
| |k  |8  < |||\
||| |\||
|\||
|| \jd d	d
 t
|D njdkrt|
j}||
|\	||
|\
||
|| \|
	 }||
| |k  |8  < |||\||| |\jd dd
 t
|D  	
fdd}| tg fS )z9tick_loc, tick_angle, tick_label, (optionally) tick_labelr@   g{Gz?r?   r   r   c                    s$      j }|t| |gjS r   )Zget_transformr"   r_   r7   column_stackT)xyZtrf)r   rD   r   r   rJ      s    zAFloatingAxisArtistHelper.get_tick_iterators.<locals>.transform_xyrB   c                 S   s   g | ]\}}|r|qS r   r   .0lmr   r   r   
<listcomp>       z?FloatingAxisArtistHelper.get_tick_iterators.<locals>.<listcomp>rA   c                 S   s   g | ]\}}|r|qS r   r   rj   r   r   r   rn      ro   c                  3   s   t 
	  } t   }
	kk@ }|| t jd  | |<   j }t| |D ]\}}}}}|||f}	d}
d|
 |	d   krd|
 krnn qnd|
 |	d   krd|
 krnn qnt ||g\}}||g|||fV  qnd S )Nr[   gh㈵>r   r   )r7   ra   Zpir#   r^   zipr_   r`   )ZddZdd2ZmmZtick_to_axesrh   ri   dZd2ZlabZc2ZdeltaZd1)r   labelsr   rb   xx1axx1bxx2axx2brc   yy1ayy1byy2ayy2br   r   f1   s    Hz7FloatingAxisArtistHelper.get_tick_iterators.<locals>.f1)r   rD   rM   r7   Zasarrayr9   r   Z	full_liker6   copyrp   r,   )r   r   rU   rV   rW   rY   ZdyrR   rS   rT   rX   ZdxZe0r<   maskrJ   Zxx00r{   r   )r   rD   rr   r   rb   rs   rt   ru   rv   rc   rw   rx   ry   rz   r   r.      sR    







$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 )NrC   )r   rM   r   r7   rf   )r   r   rh   ri   r   r   r   get_line   s    
z!FloatingAxisArtistHelper.get_line)N)r/   r0   r1   r   deprecate_privatize_attribute	grid_infor   r=   r   rZ   re   r#   r.   r~   r   r3   r   r   r   r   r4   A   s   
+Or4   c                       sb   e Zd Ze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 )GridHelperCurveLinearr   Nc                    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   rM   Z
_aux_transr   rD   )r   	aux_transrE   rH   rI   rK   rL   r   r   r   r      s    
zGridHelperCurveLinear.__init__c                 K   s0   |d ur| j | | j jf i | d | _d S r   )rD   Zupdate_transformupdateZ_old_limits)r   r   kwr   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   )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 u r| j }t| |||}t||}|jd |j|j j |S )NT)r   r4   r
   lineZset_clip_onZset_clip_boxZbbox)r   r   r6   r   r;   r   r   r   r   r   new_floating_axis.  s    
	z'GridHelperCurveLinear.new_floating_axisc                 C   s   | j ||||| _d S r   )rD   Zget_grid_inforM   )r   rN   rP   rO   rQ   r   r   r   _update_gridJ  s    z"GridHelperCurveLinear._update_gridmajorbothc                 C   sT   g }|dv r*| j d d D ]}|| q|dv rP| j d d D ]}|| q@|S )N)r   rh   lonlines)r   ri   lat)rM   extend)r   ZwhichZaxisZ
grid_linesZglr   r   r   get_gridlinesM  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  qd S )	NZ   r   )r%   r$   r&   r'   r   r   Z	tick_locsZtick_labels )dictrp   rM   )
r   r   Z	axis_sider(   Zangle_tangentZ
lon_or_latZxyarl   Zangle_normalr   r   r   r+   W  s    z'GridHelperCurveLinear.get_tick_iterator)NNNNN)N)NNNN)Nr&   )r   r   )F)r/   r0   r1   r   r   r   r   r   r   r   r   r   r+   r3   r   r   r   r   r      s&   
     
    
  


r   )r2   	itertoolsr   Znumpyr7   Z
matplotlibr   Zmatplotlib.pathr   Zmatplotlib.transformsr   r   Z	axislinesr   r	   Zaxis_artistr
   rD   r   ZFixedr   ZFloatingr4   r   r   r   r   r   <module>   s   1 <