U
    Evf *                     @   s   d Z ddlZddlZddlZddlmZmZ ddlm	Z
 ddlmZ ddl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G dd dejZG dd dZeedZeeejZeZdS )z/
An experimental support for curvilinear grid.
    N)_apicbook)Path)host_axes_class_factory   )	axislinesgrid_helper_curvelinear)
AxisArtist)ExtremeFinderSimplec                   @   s   e Zd ZdS )FloatingAxisArtistHelperN)__name__
__module____qualname__ r   r   I/tmp/pip-unpacked-wheel-7vhvci0g/mpl_toolkits/axisartist/floating_axes.pyr      s   r   c                       s6   e Zd Zd
 fdd	Zdd Zdd Zdd	 Z  ZS )FixedAxisArtistHelperNc                    sJ   | |\}}t j||||d |dkr.|}|| _|| _|| _|| _dS )z}
        nth_coord = along which coordinate value varies.
         nth_coord = 0 ->  x axis, nth_coord = 1 -> y axis
        axis_directionN)get_data_boundarysuper__init__nth_coord_ticksvaluegrid_helper_side)selfr   sider   r   	nth_coord	__class__r   r   r      s    zFixedAxisArtistHelper.__init__c                 C   s   | j | | j j| _d S N)r   
update_lim
_grid_info)r   axesr   r   r   r!   .   s    z FixedAxisArtistHelper.update_limc                    s  | j j| jd \}}}|| }| jd \}}}|| }	| j j}
t|
dd \}}t|
dd \}}fdd}| jdkr||k||k@ }t|| j|| ||f||f\\\}}\}}| jd nX| jd	kr&||	k|	|k@ }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_labellat_infolon_infoN   c                    s(      j }|tt| |jS r    )get_transform	transData	transformnpcolumn_stackZbroadcast_arraysT)xyZtrf)r#   grid_finderr   r   trf_xyA   s    z8FixedAxisArtistHelper.get_tick_iterators.<locals>.trf_xyr   
lat_labelsr   
lon_labelsc                 S   s   g | ]\}}|r|qS r   r   ).0lmr   r   r   
<listcomp>S   s      z<FixedAxisArtistHelper.get_tick_iterators.<locals>.<listcomp>)r   r   c                  3   sh   t  D ]R\} }}}}| |f}|d r|d r| |gft||g|fV  qd S )Nr   r   )zipr)   r*   Zrad2deg)r-   r.   normalZtangentZlabc2)angle_normalangle_tangentin_01labelstick_to_axesxx1yy1r   r   f1^   s
    z4FixedAxisArtistHelper.get_tick_iterators.<locals>.f1)r   r/   r"   	_extremessortedr   r   Z_value_and_jacobianr   r7   r*   Zarctan2piZget_tick_transform	transAxes	functoolspartialmplZ
transformsZ_interval_contains_closeiter)r   r#   lat_levslat_n
lat_factorZyy0lon_levslon_n
lon_factorZxx0extremesxminxmaxyminymaxr0   maskZdxx1Zdyy1Zdxx2Zdyy2mmrA   r   )	r:   r;   r#   r/   r<   r=   r>   r?   r@   r   get_tick_iterators2   sV    
        
 z(FixedAxisArtistHelper.get_tick_iteratorsc                 C   sH   |  | tddddd| j \}}| j| | \}}tt||gS )N)
lon_lines0r   )rX   r   )
lat_lines0r   )rY   r   leftrightbottomtop)r!   dictr   r"   r   r*   r+   )r   r#   kvZxxyyr   r   r   get_lineg   s    
zFixedAxisArtistHelper.get_line)N)r   r   r   r   r!   rW   rc   __classcell__r   r   r   r   r      s   5r   c                   @   s   e Zd Zdd Zdd ZdS )ExtremeFinderFixedc                 C   s
   || _ dS )z
        This subclass always returns the same bounding box.

        Parameters
        ----------
        extremes : (float, float, float, float)
            The bounding box that this helper always returns.
        NrB   )r   rP   r   r   r   r   t   s    	zExtremeFinderFixed.__init__c                 C   s   | j S r    rf   )r   Ztransform_xyx1y1x2y2r   r   r   __call__   s    zExtremeFinderFixed.__call__N)r   r   r   r   rk   r   r   r   r   re   q   s   re   c                       sB   e Zd Zd fdd	Zdd ZdddZdd	 ZdddZ  ZS )GridHelperCurveLinearNc                    s*   || _ t|}t j||||||d d S )N)grid_locator1grid_locator2tick_formatter1tick_formatter2)rB   re   r   r   )r   Z	aux_transrP   rm   rn   ro   rp   extreme_finderr   r   r   r      s    zGridHelperCurveLinear.__init__c                 C   s2   | j \}}}}t|df|df|df|dfd| S )z$
        Return v=0, nth=1.
        r   r   rZ   )rB   r_   )r   r   Zlon1Zlon2Zlat1Zlat2r   r   r   r      s    z'GridHelperCurveLinear.get_data_boundaryc                 C   sV   |d kr| j }|d kr|}t| ||d}t|||d}|jd |j|j j |S )N)r   r   T)r#   r   r	   lineZset_clip_onZset_clip_boxbbox)r   locr   r   offsetr#   Z_helperZaxisliner   r   r   new_fixed_axis   s      z$GridHelperCurveLinear.new_fixed_axisc                 C   s  | j d krt | _ | j }| j}||j||||}t|d d \}}	t|dd  \}
}||	|
|f|d< |||	\}}}t|}|	|
|\}}}t|}|||f|d< |||f|d< |
d|||d< |d|||d< |d | | }|d | | }||||k ||	k @  ||
|k ||k @  ||	|
|\}}||d< ||d	< |j|d d |dd  f| \}}||d
< ||d< d S )Nr&   rP   r%   r$   r]   r2   r1   	lon_lines	lat_linesrX   rY   )r"   r_   r/   rq   Zinv_transform_xyrC   rm   r*   Zasarrayrn   ro   rp   Z_get_raw_grid_lines)r   rg   rh   ri   rj   Z	grid_infor/   rP   Zlon_minZlon_maxZlat_minZlat_maxrM   rN   rO   rJ   rK   rL   Z
lon_valuesZ
lat_valuesrw   rx   r   r   r   _update_grid   sf    
   



       
 

z"GridHelperCurveLinear._update_gridmajorbothc                 C   s8   g }|dkr| | jd  |dkr4| | jd  |S )N)r{   r-   rw   )r{   r.   rx   )extendr"   )r   whichZaxisZ
grid_linesr   r   r   get_gridlines   s    z#GridHelperCurveLinear.get_gridlines)NNNN)NNNN)rz   r{   )	r   r   r   r   r   rv   ry   r~   rd   r   r   r   r   rl      s           
(/rl   c                       s8   e Zd Z fddZdd Z fddZdd Z  ZS )	FloatingAxesBasec                   s:   t jt|d t j|d|i| | d |   d S )N)r   r   g      ?)r   Zcheck_isinstancerl   r   r   Z
set_aspectadjust_axes_lim)r   r   argskwargsr   r   r   r     s    
zFloatingAxesBase.__init__c                 C   s`   t |  jddddg\\}}\}}\}}\}}t||f||f||f||fg}d| _|S )Nr[   r\   r]   r^   d   )mapget_grid_helperr   mpatchesZPolygonget_pathZ_interpolation_steps)r   Zx0_rg   Zy0rh   patchr   r   r   _gen_axes_patch  s    
"
z FloatingAxesBase._gen_axes_patchc                    sd   t    | j|  j | j  t   }|	| j
 || j | j| | j| d S r    )r   clearr   Zset_transformr   r/   r'   r(   r   Z
set_figurefigurerE   Zset_clip_pathZ	gridlines)r   Z
orig_patchr   r   r   r     s    

zFloatingAxesBase.clearc                 C   sL   | j  | j  | j }|dd}| |j|j | 	|j
|j d S )NgRQ?)r   r   Zget_extentsr'   r(   expandedZset_xlimrQ   rR   Zset_ylimrS   rT   )r   rs   r   r   r   r     s    
z FloatingAxesBase.adjust_axes_lim)r   r   r   r   r   r   r   rd   r   r   r   r   r      s   
r   z
Floating{}) __doc__rF   Znumpyr*   Z
matplotlibrH   r   r   Zmatplotlib.patchesZpatchesr   Zmatplotlib.pathr   Z%mpl_toolkits.axes_grid1.parasite_axesr    r   r   Zaxis_artistr	   r/   r
   r   r   re   rl   r   Z_make_class_factoryZfloatingaxes_class_factoryZAxesZFloatingAxesZFloatingSubplotr   r   r   r   <module>   s2   
T{( 