B
    îq\  ã               @   s˜   d dl Z d dlmZ d dlZd dlmZ d dlmZm	Z	 d dl
mZ dddd	gZG d
d„ dƒZG dd„ dee jdZG dd„ deƒZG dd	„ d	eƒZdS )é    N)ÚOrderedDict)ÚrcParams)ÚLine2DÚPath)Ú	PathPatchÚSpineÚ	BaseFrameÚRectangularFrameÚEllipticalFramec               @   sn   e Zd ZdZdd„ Zedd„ ƒZejdd„ ƒZedd„ ƒZejd	d„ ƒZed
d„ ƒZ	e	jdd„ ƒZ	dd„ Z
dS )r   z³
    A single side of an axes.

    This does not need to be a straight line, but represents a 'side' when
    determining which part of the frame to put labels and ticks on.
    c             C   s"   || _ || _d | _d | _d | _d S )N)Úparent_axesÚ	transformÚdataÚpixelÚworld)Úselfr   r   © r   úBlib/python3.7/site-packages/astropy/visualization/wcsaxes/frame.pyÚ__init__   s
    zSpine.__init__c             C   s   | j S )N)Ú_data)r   r   r   r   r   "   s    z
Spine.datac             C   sP   |d krd | _ d | _d | _n0|| _ | jj | j ¡| _| j | j ¡| _|  ¡  d S )N)r   Ú_pixelÚ_worldr   Ú	transDatar   Ú_update_normal)r   Úvaluer   r   r   r   &   s    c             C   s   | j S )N)r   )r   r   r   r   r   2   s    zSpine.pixelc             C   sT   |d krd | _ d | _d | _n4| jj ¡  | j ¡| _ || _| j | j ¡| _|  ¡  d S )N)r   r   r   r   r   Úinvertedr   r   )r   r   r   r   r   r   6   s    c             C   s   | j S )N)r   )r   r   r   r   r   B   s    zSpine.worldc             C   sN   |d krd | _ d | _d | _n.| j |¡| _ | jj | j ¡| _|| _|  ¡  d S )N)r   r   r   r   r   r   r   )r   r   r   r   r   r   F   s    c             C   sb   | j dd …df | j d d…df  }| j dd …df | j d d…df  }t t || ¡¡| _d S )Né   r   éÿÿÿÿ)r   ÚnpZdegreesZarctan2Znormal_angle)r   ÚdxÚdyr   r   r   r   R   s    $$zSpine._update_normalN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úpropertyr   Úsetterr   r   r   r   r   r   r   r      s   	c                   sš   e Zd ZdZd‡ fdd„	Zedd„ ƒZedd„ ƒZejd	d„ ƒZd
d„ Z	edd„ ƒZ
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zejdd„ ƒZ‡  ZS )r   z|
    Base class for frames, which are collections of
    :class:`~astropy.visualization.wcsaxes.frame.Spine` instances.
    Nc                sR   t ƒ  ¡  || _|| _td | _td | _|| _x| jD ]}t	||ƒ| |< q8W d S )Nzaxes.linewidthzaxes.edgecolor)
Úsuperr   r   Ú
_transformr   Ú
_linewidthÚ_colorÚ_pathÚspine_namesr   )r   r   r   ÚpathÚaxis)Ú	__class__r   r   r   _   s    


zBaseFrame.__init__c             C   s   | j  ¡ \}}||k rdS dS )NÚlowerÚupper)r   Úget_ylim)r   ÚyminÚymaxr   r   r   Úoriginl   s    zBaseFrame.originc             C   s   | j S )N)r'   )r   r   r   r   r   q   s    zBaseFrame.transformc             C   s"   || _ x| D ]}|| | _qW d S )N)r'   r   )r   r   r-   r   r   r   r   u   s    
c             C   s˜   |   ¡  g g  }}xD| D ]<}| | | jd d …df ¡ | | | jd d …df ¡ qW t t |¡t |¡g¡ ¡ }| jd krŒt|ƒ| _n|| j_	d S )Nr   r   )
Úupdate_spinesÚappendr   r   ZvstackZhstackÚ	transposer*   r   Úvertices)r   ÚxÚyr-   r8   r   r   r   Ú_update_patch_path{   s    

 
zBaseFrame._update_patch_pathc             C   s"   |   ¡  t| j| jjtd ddS )Nzaxes.facecolorZwhite)r   Z	facecolorZ	edgecolor)r;   r   r*   r   r   r   )r   r   r   r   Úpatch‰   s    zBaseFrame.patchc             C   s`   xZ| D ]R}| | j d d …df | | j d d …df  }}t||| j| jdd}| |¡ qW d S )Nr   r   iè  )Ú	linewidthÚcolorÚzorder)r   r   r(   r)   Údraw)r   Úrendererr-   r9   r:   Úliner   r   r   r@      s    
.zBaseFrame.drawc             C   s¢   |   ¡  tƒ }xŽ| D ]†}| | j}t dd|jd ¡}t dd|¡}t| j| jƒ||< t 	t 
|||d d …df ¡t 
|||d d …df ¡g¡ ¡ || _qW |S )Ng        g      ð?r   r   )r5   r   r   r   ÚlinspaceÚshaper   r   r   ÚarrayZinterpr7   )r   Z	n_samplesZspinesr-   r   ÚpZp_newr   r   r   Úsample•   s    

,zBaseFrame.samplec             C   s
   || _ dS )z
        Sets the color of the frame.

        Parameters
        ----------
        color : string
            The color of the frame.
        N)r)   )r   r>   r   r   r   Ú	set_color¦   s    	zBaseFrame.set_colorc             C   s   | j S )N)r)   )r   r   r   r   Ú	get_color±   s    zBaseFrame.get_colorc             C   s
   || _ dS )z¥
        Sets the linewidth of the frame.

        Parameters
        ----------
        linewidth : float
            The linewidth of the frame in points.
        N)r(   )r   r=   r   r   r   Úset_linewidth´   s    	zBaseFrame.set_linewidthc             C   s   | j S )N)r(   )r   r   r   r   Úget_linewidth¿   s    zBaseFrame.get_linewidthc             C   s   t dƒ‚d S )NÚ )ÚNotImplementedError)r   r   r   r   r5   Â   s    zBaseFrame.update_spines)N)r    r!   r"   r#   r   r$   r4   r   r%   r;   r<   r@   rG   rH   rI   rJ   rK   ÚabcÚabstractmethodr5   Ú__classcell__r   r   )r.   r   r   Y   s   )Ú	metaclassc               @   s   e Zd ZdZdZdd„ ZdS )r	   z&
    A classic rectangular frame.
    Zbrtlc             C   s   | j  ¡ \}}| j  ¡ \}}t ||g||gf¡| d _t ||g||gf¡| d _t ||g||gf¡| d _t ||g||gf¡| d _d S )NÚbÚrÚtÚl)r   Úget_xlimr1   r   rE   r   )r   ÚxminÚxmaxr2   r3   r   r   r   r5   Î   s    zRectangularFrame.update_spinesN)r    r!   r"   r#   r+   r5   r   r   r   r   r	   Ç   s   c               @   s,   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	S )
r
   z
    An elliptical frame.
    Zchvc       
      C   sä   | j  ¡ \}}| j  ¡ \}}d||  }d||  }|| }|| }t ddtj d¡}	t ||t |	¡  ||t |	¡  g¡ 	¡ | d _
t t ||d¡t |d¡g¡ 	¡ | d _
t t |d¡t ||d¡g¡ 	¡ | d _
d S )Ng      à?g        é   iè  ÚcÚhÚv)r   rV   r1   r   rC   ZpirE   ZcosZsinr7   r   Úrepeat)
r   rW   rX   r2   r3   ZxmidZymidr   r   Zthetar   r   r   r5   à   s     zEllipticalFrame.update_spinesc             C   s4   |   ¡  | d j}| jdkr(t|ƒ| _n|| j_dS )zjOverride path patch to include only the outer ellipse,
        not the major and minor axes in the middle.rZ   N)r5   r   r*   r   r8   )r   r8   r   r   r   r;   ó   s
    

z"EllipticalFrame._update_patch_pathc             C   sV   d}| | j dd…df | | j dd…df  }}t||| j| jdd}| |¡ dS )zÎOverride to draw only the outer ellipse,
        not the major and minor axes in the middle.

        FIXME: we may want to add a general method to give the user control
        over which spines are drawn.rZ   Nr   r   iè  )r=   r>   r?   )r   r   r(   r)   r@   )r   rA   r-   r9   r:   rB   r   r   r   r@   ÿ   s    .zEllipticalFrame.drawN)r    r!   r"   r#   r+   r5   r;   r@   r   r   r   r   r
   Ù   s
   )rN   Úcollectionsr   Znumpyr   Z
matplotlibr   Zmatplotlib.linesr   r   Zmatplotlib.patchesr   Ú__all__r   ÚABCMetar   r	   r
   r   r   r   r   Ú<module>   s   Hn