U
    SZf07                     @   s   d dl mZmZ d dlmZ d dlmZ edZedZ	edZ
edZdZd	Zd
d ZddddedddfddZG dd deZdS )    )
exceptionsoptional_imports)utils)
graph_objsZnumpyZpandasscipyzscipy.statszprobability densityZprobabilityc                 C   sh   t f}tr|tjf7 }tr*|tjjjf7 }t| d |sBt	dd}||krXt	dt
sdtddS )z
    Distplot-specific validations

    :raises: (PlotlyError) If hist_data is not a list of lists
    :raises: (PlotlyError) If curve_type is not valid (i.e. not 'kde' or
        'normal').
    r   zOops, this function was written to handle multiple datasets, if you want to plot just one, make sure your hist_data variable is still a list of lists, i.e. x = [1, 2, 3] -> x = [[1, 2, 3]])kdenormalz/curve_type must be defined as 'kde' or 'normal'z,FigureFactory.create_distplot requires scipyN)listnpZndarraypdcoreZseriesZSeries
isinstancer   ZPlotlyErrorr   ImportError)	hist_data
curve_typeZhist_data_typesZ
curve_opts r   C/tmp/pip-unpacked-wheel-5ksk5baj/plotly/figure_factory/_distplot.pyvalidate_distplot   s     	r         ?r   NTc
                 C   s  |dkrg }|dkrg }t | | t| | t|ttfrJ|gt|  }g }
|rxt| ||||||||	 }|
	| |r|dkrt| ||||||||	
 }nt| ||||||||	 }|
	| |	r>t| ||||||||	 }|
	| tjddtddtddgd	d
dtddgdddtddgddd
dd}n6tjddtddtddgd	d
dtddgdddd}t|
g }
tj|
|dS )aB  
    Function that creates a distplot similar to seaborn.distplot;
    **this function is deprecated**, use instead :mod:`plotly.express`
    functions, for example

    >>> import plotly.express as px
    >>> tips = px.data.tips()
    >>> fig = px.histogram(tips, x="total_bill", y="tip", color="sex", marginal="rug",
    ...                    hover_data=tips.columns)
    >>> fig.show()


    The distplot can be composed of all or any combination of the following
    3 components: (1) histogram, (2) curve: (a) kernel density estimation
    or (b) normal curve, and (3) rug plot. Additionally, multiple distplots
    (from multiple datasets) can be created in the same plot.

    :param (list[list]) hist_data: Use list of lists to plot multiple data
        sets on the same plot.
    :param (list[str]) group_labels: Names for each data set.
    :param (list[float]|float) bin_size: Size of histogram bins.
        Default = 1.
    :param (str) curve_type: 'kde' or 'normal'. Default = 'kde'
    :param (str) histnorm: 'probability density' or 'probability'
        Default = 'probability density'
    :param (bool) show_hist: Add histogram to distplot? Default = True
    :param (bool) show_curve: Add curve to distplot? Default = True
    :param (bool) show_rug: Add rug to distplot? Default = True
    :param (list[str]) colors: Colors for traces.
    :param (list[list]) rug_text: Hovertext values for rug_plot,
    :return (dict): Representation of a distplot figure.

    Example 1: Simple distplot of 1 data set

    >>> from plotly.figure_factory import create_distplot

    >>> hist_data = [[1.1, 1.1, 2.5, 3.0, 3.5,
    ...               3.5, 4.1, 4.4, 4.5, 4.5,
    ...               5.0, 5.0, 5.2, 5.5, 5.5,
    ...               5.5, 5.5, 5.5, 6.1, 7.0]]
    >>> group_labels = ['distplot example']
    >>> fig = create_distplot(hist_data, group_labels)
    >>> fig.show()


    Example 2: Two data sets and added rug text

    >>> from plotly.figure_factory import create_distplot
    >>> # Add histogram data
    >>> hist1_x = [0.8, 1.2, 0.2, 0.6, 1.6,
    ...            -0.9, -0.07, 1.95, 0.9, -0.2,
    ...            -0.5, 0.3, 0.4, -0.37, 0.6]
    >>> hist2_x = [0.8, 1.5, 1.5, 0.6, 0.59,
    ...            1.0, 0.8, 1.7, 0.5, 0.8,
    ...            -0.3, 1.2, 0.56, 0.3, 2.2]

    >>> # Group data together
    >>> hist_data = [hist1_x, hist2_x]

    >>> group_labels = ['2012', '2013']

    >>> # Add text
    >>> rug_text_1 = ['a1', 'b1', 'c1', 'd1', 'e1',
    ...       'f1', 'g1', 'h1', 'i1', 'j1',
    ...       'k1', 'l1', 'm1', 'n1', 'o1']

    >>> rug_text_2 = ['a2', 'b2', 'c2', 'd2', 'e2',
    ...       'f2', 'g2', 'h2', 'i2', 'j2',
    ...       'k2', 'l2', 'm2', 'n2', 'o2']

    >>> # Group text together
    >>> rug_text_all = [rug_text_1, rug_text_2]

    >>> # Create distplot
    >>> fig = create_distplot(
    ...     hist_data, group_labels, rug_text=rug_text_all, bin_size=.2)

    >>> # Add title
    >>> fig.update_layout(title='Dist Plot') # doctest: +SKIP
    >>> fig.show()


    Example 3: Plot with normal curve and hide rug plot

    >>> from plotly.figure_factory import create_distplot
    >>> import numpy as np

    >>> x1 = np.random.randn(190)
    >>> x2 = np.random.randn(200)+1
    >>> x3 = np.random.randn(200)-1
    >>> x4 = np.random.randn(210)+2

    >>> hist_data = [x1, x2, x3, x4]
    >>> group_labels = ['2012', '2013', '2014', '2015']

    >>> fig = create_distplot(
    ...     hist_data, group_labels, curve_type='normal',
    ...     show_rug=False, bin_size=.4)


    Example 4: Distplot with Pandas

    >>> from plotly.figure_factory import create_distplot
    >>> import numpy as np
    >>> import pandas as pd

    >>> df = pd.DataFrame({'2012': np.random.randn(200),
    ...                    '2013': np.random.randn(200)+1})
    >>> fig = create_distplot([df[c] for c in df.columns], df.columns)
    >>> fig.show()
    Nr   overlayZclosestreversed)Z
traceorderg        r   y2F)domainanchorZzerolinegffffff?   free)r   r   positionr   g      ?x1)r   r   ZdtickZshowticklabels)barmode	hovermodelegendxaxis1yaxis1Zyaxis2)r   r   r    r!   r"   )datalayout)r   r   Zvalidate_equal_lengthr   floatintlen	_Distplot	make_histappendmake_normalmake_kdemake_rugr   ZLayoutdictsumZFigure)r   group_labelsbin_sizer   colorsrug_texthistnorm	show_hist
show_curveZshow_rugr#   histcurverugr$   r   r   r   create_distplot2   s    {




	
r:   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )r(   z?
    Refer to TraceFactory.create_distplot() for docstring
    c
              
   C   s   || _ || _|| _|| _|| _|	| _t|| _|r:|| _nd g| j | _g | _	g | _
|r`|| _nddddddddd	d
g
| _d g| j | _d g| j | _| j D ],}
| j	t|
d  | j
t|
d  qd S )Nzrgb(31, 119, 180)zrgb(255, 127, 14)zrgb(44, 160, 44)zrgb(214, 39, 40)zrgb(148, 103, 189)zrgb(140, 86, 75)zrgb(227, 119, 194)zrgb(127, 127, 127)zrgb(188, 189, 34)zrgb(23, 190, 207)r   )r   r4   r0   r1   r5   r6   r'   trace_numberr3   startendr2   curve_xcurve_yr*   minmax)selfr   r4   r0   r1   r   r2   r3   r5   r6   tracer   r   r   __init__  s<    

z_Distplot.__init__c                 C   s   dg| j  }t| j D ]l}td| j| dd| j| j| | j| t| j|t| j  ddt| j| | j	| | j
| ddd	||< q|S )
z
        Makes the histogram(s) for FigureFactory.create_distplot().

        :rtype (list) hist: list of histogram representations
        NZ	histogramr   y1colorF)r<   r=   sizegffffff?)typexxaxisyaxisr4   namelegendgroupmarkerZautobinxZxbinsZopacity)r;   ranger.   r   r4   r0   r2   r'   r<   r=   r1   )rB   r7   indexr   r   r   r)   ?  s(    z_Distplot.make_histc                    s   dgj  }tj D ]d  fddtdD j < tj  j  j < jtkrj   j	  9  < qtj D ]\ t
dj  j  dddj  j  jrd	nd
t
j tj  dd
| < q|S )z
        Makes the kernel density estimation(s) for create_distplot().

        This is called when curve_type = 'kde' in create_distplot().

        :rtype (list) curve: list of kde representations
        Nc                    s2   g | ]*}j   |j  j     d   qS   r<   r=   .0rJ   rQ   rB   r   r   
<listcomp>e  s   z&_Distplot.make_kde.<locals>.<listcomp>rS   scatterr   rE   linesFTrF   
rI   rJ   yrK   rL   moderM   rN   
showlegendrO   )r;   rP   r>   scipy_statsZgaussian_kder   r?   r4   ALTERNATIVE_HISTNORMr1   r.   r0   r5   r2   r'   )rB   r8   r   rW   r   r,   [  s0    

z_Distplot.make_kdec                    s$  dgj  }dgj  }dgj  }tj D ] tjj  \| < | <  fddtdD j < tjjj  |  |  dj < j	t
kr.j   j  9  < q.tj D ]\ tdj  j  ddd	j  j  jrd
ndtj tj  dd
| < q|S )z
        Makes the normal curve(s) for create_distplot().

        This is called when curve_type = 'normal' in create_distplot().

        :rtype (list) curve: list of normal curve representations
        Nc                    s2   g | ]*}j   |j  j     d   qS rR   rT   rU   rW   r   r   rX     s   z)_Distplot.make_normal.<locals>.<listcomp>rS   )locZscalerY   r   rE   rZ   FTrF   r[   )r;   rP   r_   ZnormZfitr   r>   Zpdfr?   r4   r`   r1   r.   r0   r5   r2   r'   )rB   r8   Zmeansdr   rW   r   r+     s:      
z_Distplot.make_normalc                 C   s   dg| j  }t| j D ]|}td| j| | j| gt| j|  ddd| j| | j| | js`| jrddnd| j| t| j	|t| j	  dd	d
||< q|S )z{
        Makes the rug plot(s) for create_distplot().

        :rtype (list) rug: list of rug plot representations
        NrY   r   r   markersFTzline-ns-open)rG   symbol)rI   rJ   r\   rK   rL   r]   rM   rN   r^   textrO   )
r;   rP   r.   r   r0   r'   r5   r6   r3   r2   )rB   r9   rQ   r   r   r   r-     s&     z_Distplot.make_rugN)	__name__
__module____qualname____doc__rD   r)   r,   r+   r-   r   r   r   r   r(   
  s   0$(r(   )Zplotlyr   r   Zplotly.figure_factoryr   Zplotly.graph_objsr   Z
get_moduler
   r   r   r_   ZDEFAULT_HISTNORMr`   r   r:   objectr(   r   r   r   r   <module>   s(   



%
 Y