U
    Evf1                     @   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takeZminimummaximum)funcxsZysZxlimsZylimsr   valZxloZxhiZdxloZdxhiZxepsZval_dxZyloZyhiZdyloZdyhiZyepsZval_dy r   S/tmp/pip-unpacked-wheel-7vhvci0g/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rt	||}t
||	}	|||	\}}}||
|\}}}| jdkrt| 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rdkrn nHd|d   krdkrn 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  qd S )	NZ   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   Z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   ( 