ó
 m[c           @` s–  d  Z  d d l m Z m Z m Z m Z d d l Z d d l m Z d d l	 Z
 d d l m Z m Z d d l m Z d d l m Z m Z d d	 l m Z d d
 l m Z d e j f d „  ƒ  YZ d e j f d „  ƒ  YZ d d l m Z d e f d „  ƒ  YZ d e j f d „  ƒ  YZ d e f d „  ƒ  YZ i  Z d „  Z d d l m  Z  d d l! m" Z" e e" e  ƒ ƒ Z# d d l$ j% Z& e& j' e# ƒ Z( d S(   u/   
An experimental support for curvilinear grid.
i    (   t   absolute_importt   divisiont   print_functiont   unicode_literalsN(   t   zip(   t   Affine2Dt   IdentityTransformi   (   t   grid_helper_curvelinear(   t   AxisArtistHelpert   GridHelperBase(   t
   AxisArtist(   t
   GridFindert   FloatingAxisArtistHelperc           B` s   e  Z RS(    (   t   __name__t
   __module__(    (    (    sD   lib/python2.7/site-packages/mpl_toolkits/axisartist/floating_axes.pyR      s   t   FixedAxisArtistHelperc           B` sJ   e  Z d d  „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 RS(   c         C` st   | j  | ƒ \ } } t t |  ƒ j | | | d | ƒ| d k rL | } n  | |  _ | |  _ | |  _ | |  _ d S(   u}   
        nth_coord = along which coordinate value varies.
         nth_coord = 0 ->  x axis, nth_coord = 1 -> y axis
        t   axis_directionN(	   t   get_data_boundaryt   superR   t   __init__t   Nonet   nth_coord_tickst   valuet   grid_helpert   _side(   t   selfR   t   sideR   R   t	   nth_coord(    (    sD   lib/python2.7/site-packages/mpl_toolkits/axisartist/floating_axes.pyR      s    				c         C` s#   |  j  j | ƒ |  j  j |  _ d  S(   N(   R   t
   update_limt	   grid_info(   R   t   axes(    (    sD   lib/python2.7/site-packages/mpl_toolkits/axisartist/floating_axes.pyR   2   s    c         C` sû  |  j  d } |  j d k ra |  j } | d | d d } d t | d | d ƒ d } } nT |  j d k rµ | d | d d } |  j } t | d | d ƒ d d } } n  |  j j } | j | g | g ƒ \ } }	 | j | j j	 ƒ  }
 |
 j
 | d |	 d g ƒ } d | d k o-d	 k n ród | d k oMd	 k n ró| j j
 | d |	 d g ƒ \ } } | j | | g | | g ƒ \ } } | j j
 | d | d g ƒ \ } } | | f t j | | | | ƒ t j d
 f Sd Sd  S(   Nu   extremesi    i   i   g       @g        g     @@i   g      ð?g     €f@(   NN(   R   R   R   t   absR   t   grid_findert   transform_xyt	   transDatat	   transAxest   invertedt   transform_pointt   npt   arctan2t   piR   (   R   R   t   extremest   xx0t   yy0t   dxxt   dyyR    t   xx1t   yy1t   trans_passingthrough_pointt   pt   xx1ct   yy1ct   xx2t   yy2t   xx2ct   yy2c(    (    sD   lib/python2.7/site-packages/mpl_toolkits/axisartist/floating_axes.pyt   get_axislabel_pos_angle9   s&    	&	&@&&&/c         C` s   t  ƒ  S(   N(   R   (   R   R   (    (    sD   lib/python2.7/site-packages/mpl_toolkits/axisartist/floating_axes.pyt   get_tick_transformX   s    c         ` s  ˆ j  j ‰ ˆ j d \ } } } ˆ j d \ } } } t j | ƒ t j | ƒ } } | d k	 rz | | } d | }	 n | } d }	 | d k	 r© | | }
 d | } n | }
 d } ˆ j  j } t | d  ƒ \ } } t | d ƒ \ } } ˆ j d k r| | k | | k @} | | } n2 ˆ j d k rQ| |
 k |
 | k @} |
 | }
 n  ‡  ‡ f d †  } ˆ j d k ržt j	 | ƒ }
 |
 j
 ˆ j ƒ | |
 | ƒ \ ‰ ‰	 |
 j t d t ƒ} | |
 | | k c | 8<| | | ƒ \ ‰ ‰
 | | | | ƒ \ ‰ ‰ | j t d t ƒ} | | |	 | k c |	 8<| |
 | ƒ \ ‰ ‰ | |
 | |	 ƒ \ ‰ ‰ ˆ j d	 ‰ g  t ˆ | ƒ D] \ } } | r}| ^ q}‰ n;ˆ j d k rÙt j	 |
 ƒ } | j
 ˆ j ƒ | |
 | ƒ \ ‰ ‰	 | j t d t ƒ} | | |	 | k c |	 8<| |
 | ƒ \ ‰ ‰
 | |
 | |	 ƒ \ ‰ ‰ |
 j t d t ƒ} | |
 | | k c | 8<| | | ƒ \ ‰ ‰ | | | | ƒ \ ‰ ‰ ˆ j d
 ‰ g  t ˆ | ƒ D] \ } } | r¸| ^ q¸‰ n  ‡  ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡	 ‡
 ‡ ‡ ‡ f d †  } | ƒ  t g  ƒ f S(   u9   tick_loc, tick_angle, tick_label, (optionally) tick_labelu   lat_infou   lon_infogü©ñÒMbP?i   i    i   c         ` s[   ˆ j  |  | ƒ \ } } ˆ  j j t j | | g ƒ j ƒ  ƒ } | j ƒ  \ } } | | f S(   N(   R!   R"   t	   transformR&   t   arrayt	   transpose(   t   xt   yt   x1t   y1t   x2y2t   x2t   y2(   R   R    (    sD   lib/python2.7/site-packages/mpl_toolkits/axisartist/floating_axes.pyR!   }   s    't   copyu
   lat_labelsu
   lon_labelsc          3` sd  t  j ˆ
 ˆ	 ˆ ˆ ƒ }  t  j ˆ ˆ ˆ ˆ ƒ } ˆ
 ˆ	 d k ˆ ˆ d k @} | | t  j d |  | <ˆ j ˆ  ƒ } | ˆ  j j ƒ  } xÐ t ˆ ˆ |  | ˆ ƒ D]¶ \ } } } } }	 | j | | f ƒ }
 d } d | |
 d k où d | k n r¦ d | |
 d k o!d | k n r¦ | d d } | d d } | | g | | |	 f Vq¦ q¦ Wd  S(	   Ng        i   gñhãˆµøä>i    g      ð?i   gn†ðù!	@g     €f@(   R&   R'   R(   R9   R#   R$   R   R%   (   t   ddt   dd2t   mmt
   trans_tickt   tr2axR=   R>   t   dt   d2t   labt   c2t   deltat   d1(   R   t   labelsR   R.   t   xx1at   xx1bt   xx2at   xx2bR/   t   yy1at   yy1bt   yy2at   yy2b(    sD   lib/python2.7/site-packages/mpl_toolkits/axisartist/floating_axes.pyt   f1¯   s    .((N(   R   R    R   R&   t   asarrayR   t	   _extremest   sortedR   t
   empty_liket   fillR   t   astypet   floatt   TrueR   t   iter(   R   R   t   lat_levst   lat_nt
   lat_factort   lon_levst   lon_nt
   lon_factorR+   t   dyR*   t   dxR[   t   xmint   xmaxt   ymint   ymaxt   maskR!   t   xx00t   yy00t   lt   mRY   (    (   R   R    RP   R   R.   RQ   RR   RS   RT   R/   RU   RV   RW   RX   sD   lib/python2.7/site-packages/mpl_toolkits/axisartist/floating_axes.pyt   get_tick_iterators[   sl    

113c         C` s   | j  S(   N(   R"   (   R   R   (    (    sD   lib/python2.7/site-packages/mpl_toolkits/axisartist/floating_axes.pyt   get_line_transformÉ   s    c      
   C` s{   |  j  | ƒ d d l m } t d d
 d d d d d	 d ƒ |  j \ } } |  j | | \ } } | t j | | g ƒ ƒ S(   Ni    (   t   Patht   leftu
   lon_lines0t   righti   t   bottomu
   lat_lines0t   top(   u
   lon_lines0i    (   u
   lon_lines0i   (   u
   lat_lines0i    (   u
   lat_lines0i   (   R   t   matplotlib.pathRv   t   dictR   R   R&   t   column_stack(   R   R   Rv   t   kt   vt   xxt   yy(    (    sD   lib/python2.7/site-packages/mpl_toolkits/axisartist/floating_axes.pyt   get_lineÌ   s    N(
   R   R   R   R   R   R8   R9   Rt   Ru   R‚   (    (    (    sD   lib/python2.7/site-packages/mpl_toolkits/axisartist/floating_axes.pyR      s   				n	(   t   ExtremeFinderSimplet   ExtremeFinderFixedc           B` s   e  Z d  „  Z d „  Z RS(   c         C` s   | |  _  d  S(   N(   R[   (   R   R)   (    (    sD   lib/python2.7/site-packages/mpl_toolkits/axisartist/floating_axes.pyR   Ý   s    c         C` s   |  j  S(   u   
        get extreme values.

        x1, y1, x2, y2 in image coordinates (0-based)
        nx, ny : number of division in each axis
        (   R[   (   R   R!   R?   R@   RB   RC   (    (    sD   lib/python2.7/site-packages/mpl_toolkits/axisartist/floating_axes.pyt   __call__à   s    (   R   R   R   R…   (    (    (    sD   lib/python2.7/site-packages/mpl_toolkits/axisartist/floating_axes.pyR„   Ü   s   	t   GridHelperCurveLinearc           B` s\   e  Z d d d d d  „ Z d „  Z d d d d d „ Z d „  Z d d d „ Z d „  Z RS(	   c         C` sS   d |  _ | |  _ t | ƒ } t t |  ƒ j | | d | d | d | d | ƒd S(   uÄ  
        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)*
        t   grid_locator1t   grid_locator2t   tick_formatter1t   tick_formatter2N(   R   t   _old_valuesR[   R„   R   R†   R   (   R   t	   aux_transR)   R‡   Rˆ   R‰   RŠ   t   extreme_finder(    (    sD   lib/python2.7/site-packages/mpl_toolkits/axisartist/floating_axes.pyR   î   s    		c      
   C` sP   |  j  \ } } } } t d | d f d | d f d | d f d | d f ƒ | S(   u%   
        return v= 0 , nth=1
        Rw   i    Rx   Ry   i   Rz   (   R[   R|   (   R   R   t   lon1t   lon2t   lat1t   lat2(    (    sD   lib/python2.7/site-packages/mpl_toolkits/axisartist/floating_axes.pyR   !  s
    c         C` s   | d  k r |  j } n  | d  k r- | } n  t |  | d | ƒ} t | | d | ƒ} | j j t ƒ | j j | j j ƒ | S(   NR   R   (	   R   R   R   R
   t   linet   set_clip_onRa   t   set_clip_boxt   bbox(   R   t   locR   R   t   offsetR   t   _helpert   axisline(    (    sD   lib/python2.7/site-packages/mpl_toolkits/axisartist/floating_axes.pyt   new_fixed_axis,  s    		c         C` s7  |  j  d  k r t ƒ  |  _  n  |  j  } |  j } | j | j | | | | ƒ } t | d  ƒ \ } }	 t | d ƒ \ }
 } | j | |	 ƒ \ } } } | j |
 | ƒ \ } } } | |	 |
 | f | d <| | | f | d <| | | f | d <| j	 d | | ƒ | d <| j
 d | | ƒ | d <| d  k r@t j | |  ƒ } n t j | |  | ƒ } | d  k ryt j | |  ƒ } n t j | |  | ƒ } | | | k  | |	 k  @} | |
 | k  | | k  @} | j | | | |	 |
 | ƒ \ } } | | d <| | d	 <| j | d  | d | Œ \ } } | | d
 <| | d <d  S(   Ni   u   extremesu   lon_infou   lat_infou   bottomu
   lon_labelsu
   lat_labelsu	   lon_linesu	   lat_linesu
   lon_lines0u
   lat_lines0(   R   R   R|   R    R   t   inv_transform_xyR\   R‡   Rˆ   R‰   RŠ   R&   RZ   t   _get_raw_grid_lines(   R   R?   R@   RB   RC   R   R    R)   t   lon_mint   lon_maxt   lat_mint   lat_maxRf   Rg   Rh   Rc   Rd   Re   t
   lon_valuest
   lat_valuest   lon_values0t   lat_values0t	   lon_linest	   lat_lines(    (    sD   lib/python2.7/site-packages/mpl_toolkits/axisartist/floating_axes.pyt   _update_gridZ  sL    					


u   majoru   bothc         C` sx   g  } | d k r= x( |  j  d D] } | j | g ƒ q  Wn  | d k rt x( |  j  d D] } | j | g ƒ qW Wn  | S(   Nu   bothu   xu	   lon_linesu   yu	   lat_lines(   u   bothu   x(   u   bothu   y(   R   t   extend(   R   t   whicht   axist
   grid_linest   gl(    (    sD   lib/python2.7/site-packages/mpl_toolkits/axisartist/floating_axes.pyt   get_gridlines›  s    c         C` sF  |  j  \ } } } } |  j } t j | | d ƒ } t j | ƒ t j | ƒ } } | j | ƒ | j | ƒ t j | | d ƒ }	 t j |	 ƒ t j |	 ƒ }
 } |
 j | ƒ | j | ƒ t j | d  | d  | d d d … |
 g ƒ } t j | d  |	 d  | d  |	 d d d … g ƒ } | j t j | | g ƒ j	 ƒ  ƒ } | S(   uD   
        return Nx2 array of x,y coordinate of the boundary
        id   iÿÿÿÿi    N(
   R[   t
   _aux_transR&   t   linspaceR]   R^   t   concatenateR:   R;   R<   (   R   t   x0R?   t   y0R@   t   trR€   R+   R/   R   R*   R.   t   xxxt   yyyt   t(    (    sD   lib/python2.7/site-packages/mpl_toolkits/axisartist/floating_axes.pyt   get_boundary§  s    	04$N(	   R   R   R   R   R   Rš   R§   R­   R·   (    (    (    sD   lib/python2.7/site-packages/mpl_toolkits/axisartist/floating_axes.pyR†   ì   s   /	*	At   FloatingAxesBasec           B` s,   e  Z d  „  Z d „  Z d „  Z d „  Z RS(   c         O` s|   | j  d d  ƒ } | d  k r- t d ƒ ‚ n  t | d ƒ sK t d ƒ ‚ n  |  j j |  | | Ž |  j d ƒ |  j ƒ  d  S(   Nu   grid_helperu*   FloatingAxes requires grid_helper argumentu   get_boundaryu.   grid_helper must implement get_boundary methodg      ð?(   t   getR   t
   ValueErrort   hasattrt   _axes_class_floatingR   t
   set_aspectt   adjust_axes_lim(   R   t   klt   kwargsR   (    (    sD   lib/python2.7/site-packages/mpl_toolkits/axisartist/floating_axes.pyR   Ë  s    c         C` s4   d d l  j } |  j ƒ  } | j ƒ  } | j | ƒ S(   u[  
        Returns the patch used to draw the background of the axes.  It
        is also used as the clipping path for any data elements on the
        axes.

        In the standard axes, this is a rectangle, but in other
        projections it may not be.

        .. note::
            Intended to be overridden by new projection types.
        i    N(   t   matplotlib.patchest   patchest   get_grid_helperR·   t   Polygon(   R   t   mpatchesR   R¶   (    (    sD   lib/python2.7/site-packages/mpl_toolkits/axisartist/floating_axes.pyt   _gen_axes_patchØ  s    c         C` s   |  j  j |  ƒ |  j j |  j ƒ |  j  j |  ƒ } | j |  j ƒ | j t	 ƒ | j |  j
 ƒ |  j j | ƒ |  j j | ƒ | |  _ d  S(   N(   R¼   t   clat   patcht   set_transformR"   RÆ   t
   set_figuret   figuret   set_visiblet   FalseR#   t   set_clip_patht	   gridlinest   _original_patch(   R   RÈ   (    (    sD   lib/python2.7/site-packages/mpl_toolkits/axisartist/floating_axes.pyRÇ   é  s    c         C` sÇ   |  j  ƒ  } | j ƒ  } | d  d  … d f | d  d  … d f } } t | ƒ t | ƒ } } t | ƒ t | ƒ } } | | d }	 | | d }
 |  j | |	 | |	 ƒ |  j | |
 | |
 ƒ d  S(   Ni    i   g      Y@(   RÃ   R·   t   mint   maxt   set_xlimt   set_ylim(   R   R   R¶   R=   R>   Rk   Rl   Rm   Rn   Rj   Ri   (    (    sD   lib/python2.7/site-packages/mpl_toolkits/axisartist/floating_axes.pyR¾   ú  s    -(   R   R   R   RÆ   RÇ   R¾   (    (    (    sD   lib/python2.7/site-packages/mpl_toolkits/axisartist/floating_axes.pyR¸   È  s   			c         C` sX   t  j |  ƒ } | d  k rT t t d |  j ƒ t |  f i |  d 6ƒ } | t  |  <n  | S(   Nu   Floating %su   _axes_class_floating(   t   _floatingaxes_classesR¹   R   t   typet   strR   R¸   (   t
   axes_classt	   new_class(    (    sD   lib/python2.7/site-packages/mpl_toolkits/axisartist/floating_axes.pyt   floatingaxes_class_factory  s    	(   t   Axes(   t   host_axes_class_factory()   t   __doc__t
   __future__R    R   R   R   t   sixt	   six.movesR   t   numpyR&   t   matplotlib.transformsR   R   t    R   t	   axislinesR   R	   t   axis_artistR
   R    R   R   R   Rƒ   R„   R†   t   objectR¸   RÕ   RÚ   RÛ   t%   mpl_toolkits.axes_grid1.parasite_axesRÜ   t   FloatingAxest   matplotlib.axesR   t   maxest   subplot_class_factoryt   FloatingSubplot(    (    (    sD   lib/python2.7/site-packages/mpl_toolkits/axisartist/floating_axes.pyt   <module>   s,   "ÀÜD	