U
    SZf                    @   s  d dl mZ d dlmZ d dlmZmZ ddl	m
Z
mZmZ ddlmZmZmZmZmZ d dlmZ d dlmZmZ d dlZd dlmZ d dlZd dlZd d	lm Z m!Z!m"Z" e#ej$e#d
kZ%dZ&e'eeeeedZddddddddddddgddddddg dd d!d"d#d$g d%d&d'd(d)g Z(d*d+d,d-d.gZ)d/d0d1d2gZ*d3d4d5d6gZ+e(e) e* e+ Z,ej-ej.ej/ej0ej1ej2gZ3e3ej4ej5ej6g7 Z3G d7d8 d8e7Z8e8 Z9[8da:d9d: Z;d;d< Z<ed=d>d?d@dAdBdCdDgZ=edEdFdGdHdIgZ>dJdK Z?dLdM Z@dNdO ZAdPdQ ZBdRdS ZCdTdU ZDdVdW ZEdXdY ZFdZd[ ZGd\d] ZHd^d_ ZId`da ZJdbdc ZKddde ZLdfdg ZMdhdi ZNdjdk ZOdldm ZPdndo ZQdpdq ZRdrds ZSdtdu ZTdvdw ZUdxdy ZVdzd{ ZWd|d} ZXdd~dZYdd ZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`dd ZadddZbdd ZcdS )    N)
namedtupleOrderedDict   )IdentityMapConstantRange)olslowessrolling	expandingewm)ColorscaleValidator)qualitative
sequential)version)make_subplots_set_trace_grid_reference_subplot_type_for_trace_typez2.2.0Zpx_no_color_constant)r	   r
   r   r   r   basexyzabcrthetasizex_startx_end
hover_nametextnamesvaluesparents
wide_crossidsZerror_xZerror_x_minusZerror_yZerror_y_minusZerror_zZerror_z_minuslatlon	locationsanimation_group
dimensionscustom_data
hover_datapathwide_variableanimation_frame	facet_row	facet_col
line_groupcolorsymbol	line_dashpattern_shapec                   @   s>   e Zd Zddddddddd	d
dddddgZdd Zdd ZdS )
PxDefaultstemplatewidthheightcolor_discrete_sequencecolor_discrete_mapcolor_continuous_scalesymbol_sequence
symbol_mapline_dash_sequenceline_dash_mappattern_shape_sequencepattern_shape_mapsize_maxcategory_orderslabelsc                 C   s   |    d S N)resetself rL   8/tmp/pip-unpacked-wheel-5ksk5baj/plotly/express/_core.py__init__E   s    zPxDefaults.__init__c                 C   s^   d | _ d | _d | _d | _i | _d | _d | _i | _d | _i | _	d | _
i | _d| _i | _i | _d S )N   )r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rJ   rL   rL   rM   rI   H   s    zPxDefaults.resetN)__name__
__module____qualname__	__slots__rN   rI   rL   rL   rL   rM   r8   2   s$   r8   c                 C   s   | a dS )z
    Arguments:
        token: A Mapbox token to be used in `plotly.express.scatter_mapbox` and         `plotly.express.line_mapbox` figures. See         https://docs.mapbox.com/help/how-mapbox-works/access-tokens/ for more details
    N)MAPBOX_TOKEN)tokenrL   rL   rM   set_mapbox_access_tokena   s    rV   c                 C   s   | j S )a  
    Extracts fit statistics for trendlines (when applied to figures generated with
    the `trendline` argument set to `"ols"`).

    Arguments:
        fig: the output of a `plotly.express` charting call
    Returns:
        A `pandas.DataFrame` with a column "px_fit_results" containing the `statsmodels`
        results objects, along with columns identifying the subset of the data the
        trendline was fit on.
    )_px_trendlines)figrL   rL   rM   get_trendline_resultsl   s    rY   Mappingshow_in_trace_namegrouperval_mapsequenceupdatervariablefacet	TraceSpecconstructorattrstrace_patchmarginalc                 C   s,   z| d | W S  t k
r&   | Y S X d S )NrG   )	Exception)argscolumnrL   rL   rM   	get_label   s    rj   c                 C   s>   dd | d   D }z
|| W S  tk
r8   | Y S X dS )zInvert mapping.
    Find key corresponding to value column in dict args["labels"].
    Returns `column` if the value does not exist.
    c                 S   s   i | ]\}}||qS rL   rL   ).0keyvaluerL   rL   rM   
<dictcomp>   s      z invert_label.<locals>.<dictcomp>rG   N)itemsrg   )rh   ri   Zreversed_labelsrL   rL   rM   invert_label   s
    
rp   c                 C   s   | | j jdkS )NZifc)dtypekind)dfcol_namerL   rL   rM   _is_continuous   s    ru   c                 C   s`  t | | }}d| kr\|dks^|dkr<d| kr<| d dks^|dkr\d| kr\| d dkr\| d phd}|dkrd	||f }nd}d
| kr4| d
 d k	r4|dkr| d
 }n| d
 }|dkr|dkrd	d|f }n"|dkrd	||f }nd||f }n<|dkrdd|f }n$|dkr(dd|f }nd	||f }d| kr\| d d k	r\d|| d f }|S )Nhistfuncr   r   orientationhr   vcountz%s of %shistnormsumprobabilityfractionpercentz%s weighted by %sz%s of sum of %sZbarnormz%s (normalized as %s))rj   )rh   ri   roleZoriginal_labellabelrv   r{   rL   rL   rM   get_decorated_label   sL    





r   c              	      s$  dksdkr0t d|  i dgdd d dS dks@d	krd	krLd
nd}t d||  i dd tddD dd dkrdnddS d^ }}dkrd}dkrd}d}dkrd}d}| |d  dkrt }n| |d   }t d| | || |d   fddd dS ) Nr3   r0   F c                 S   s   |S rH   rL   tracery   rL   rL   rM   <lambda>       zmake_mapping.<locals>.<lambda>)r[   r\   r]   r^   r`   r_   ra   r1   r2   r   r   c                 S   s   g | ]}|qS rL   rL   rk   irL   rL   rM   
<listcomp>   s     z make_mapping.<locals>.<listcomp>r     c                 S   s   |S rH   rL   r   rL   rL   rM   r      r   rowcol)r[   r`   r\   r]   r^   r_   ra   .r4   Zcolor_discretedashr6   )patternshaper7   _mapidentityTZ	_sequencec                    s   |  dg  |iiS )Nr   )updatejoinr   Zother_variablesparentr`   rL   rM   r      s   )rZ   rangesplitr   copy)rh   r`   letterZvprefixarg_namer]   rL   r   rM   make_mapping   sX    		
r   c           $         s  d kr( d r(t ||jdd g}j p4i }d}d}jD ]} | t |}	|dkrЇ fdd| D }
 fdd|
D |d< jt	j
kr|d D ]}td	d
|d< qd|d< d|d< qDdk	r|dkr*d|krt |d< | |d d< d|d d< ||d d< d||	< q|dkrNjt	jkrd|d< q|dkrrjt	jkrd|d< q|dkr> d r̈ d rt| d  d g  dkr|j d d}| d  j}| d  j}|jjtjkr |tjd }nH|jjtjkrHz|tj}W n& tk
rF   td d  Y nX |jjtjkrz|tj}W n tk
r   tdY nX ttt|t|}| d  | |d< t }| d  | d  || d  d |\}}}t|t|d kstd!||d< d|t  d < d"|t  d < q| d#r|dd$ }|!d%rfd&nd'}||kr|i ||< | || |< q|d(krtd)kr| |d*< q|d+krjt	jt	j"t	j#fkr| |d,< |dkrd-}q|d.krjt	jt	j"t	j#fkrt$t} %d(p2g }D ]}|rP| sPq8| %d %d %d/ %d0fkr~q8z d( &|}W n. tt't(fk
r   t|}|)| Y nX t |d}d1| ||< q8t|d)kr|| |d*< q|d2krjt	j*t	j+t	j,fkr<| |d/< d3|d4< d5||	< q̈jt	j-t	j.t	j/t	j0t	j1fkr&d|krpt |d<  %d6r| |d d7< d3|d d4< d8||	< ng |d d7<  d9 dk	rʈ d9  }ni }| D ]L}|%|dkr
 d: t|t d:   ||< |d d7 )||  qnXd}jt	j2t	j3fkrBd;}||krVt ||< | || d2< d3|| d4< d<| ||	< q|d=kr| |d>< q|d?kr| ||< d@||	< q|dAkr| ||< |	dAkrdBn|	}dC||< n|dDkr"| ||< |	dDkrdEn|	}dF||< n|d>krT| ||< |	d>krFdGn|	}dH||< nx|dIkrjt	j-t	j.t	j/t	j0t	j1fkr| |dJ< |	dIkrdKn|	}dL||< n| ||< n| ||< dM| ||	< qDjt	jkr|dNks jt	j"t	j#fkrD|d/krDdM| ||	< qDjt	j3t	j2fkrt4|} d. rt$ d. tr| D ]d\}}t5 |} |  d. krL d. |  d) }!|!rt$|!t6r|7dOdP|! ||< n
|8|}"qLdQd | D }#|dR9|# |dS< |dS  dT7  < ||fS )Ua:  Populates a dict with arguments to update trace

    Parameters
    ----------
    args : dict
        args to be used for the trace
    trace_spec : NamedTuple
        which kind of trace to be used (has constructor, marginal etc.
        attributes)
    trace_data : pandas DataFrame
        data
    mapping_labels : dict
        to be used for hovertemplate
    sizeref : float
        marker sizeref

    Returns
    -------
    trace_patch : dict
        dict to be used to update trace
    fit_results : dict
        fit information to be used for trendlines
    Z
line_closeNr   r   r+   c                    sv   g | ]n\}}r|krj tjks2t d  |rj tjksjdk	rN|ksjt d  |   d kr||fqS )
data_frameNZdimensions_max_cardinality)rc   go	Parcoordsru   Parcatslenuniquerk   nameri   rh   
attr_value
trace_specrL   rM   r     s     z%make_trace_kwargs.<locals>.<listcomp>c                    s"   g | ]\}}t t ||d qS ))r   r#   )dictrj   r   rh   rL   rM   r   )  s   T)matchesaxisz%{x}z%{xaxis.title.text}z%{y}z%{yaxis.title.text}r   markerareaZsizemodesizerefz%{marker.size}
marginal_xrz   
marginal_y	trendliner   r   byi ʚ;zCould not convert value of 'x' ('%s') into a numeric type. If 'x' contains stringified dates, please convert to a datetime column.z3Could not convert value of 'y' into a numeric type.trendline_optionsz/missing-data-handling failure in trendline codez%{y} <b>(trend)</b>error   minusZ
arrayminusarrayr,   r   Z
customdatar    Z	hovertextz<b>%{hovertext}</b><br><br>r-   r   r   z%%{customdata[%d]}r4   
coloraxis1	coloraxisz%{z}color_is_continuouscolorsz%{color}r=   r<   linez%%{%s.color}r*   r&   r)   z%{location}r#   rm   z%{value}r$   r   z	%{parent}idz%{id}r"   rG   r   z%{label}z%%{%s}r   r   }z%s}c                 S   s   g | ]\}}|d  | qS )=rL   )rk   kry   rL   rL   rM   r     s     z<br>Zhovertemplatez<extra></extra>):pdconcatilocre   r   rd   r   ro   rc   r   Splomr   	Histogramr   Zdropnasort_valuesr#   rq   typenpZ
datetime64astypeZint64Zobject_Zfloat64
ValueErrorZlogical_not
logical_orisnantrendline_functionsAssertionErrorrj   
startswithendswithHistogram2dHistogram2dContour
isinstancegetindexAttributeErrorKeyErrorappend
ChoroplethChoroplethmapChoroplethmapboxSunburstTreemapIciclePie
Funnelarear   r   r   rp   strreplacepopr   )$rh   r   Z
trace_datamapping_labelsr   re   fit_resultsZhover_header	attr_nameZ
attr_labelZdimsdZsorted_trace_datar   r   Znon_missingZtrendline_functionZy_outZerror_xyZarrZhover_is_dictZcustomdata_colsr   positionZattr_label_colmappingcatZ	colorableZ_labelZmapping_labels_copyr   ry   Zk_args	formatter_Zhover_linesrL   r   rM   make_trace_kwargs   s   












	























r   c                 C   s   t jtt jtt jtt jtt jtt j	t
t jt
t jt
t jtt jtt jtt jtt jti}tD ]}t||< qV||kr||| | || d S rH   )r   Z	Scatter3dconfigure_3d_axesZScatterternaryconfigure_ternary_axesScatterpolarconfigure_polar_axesScatterpolarglZBarpolar
Scattermapconfigure_mapr   
DensitymapScattermapboxconfigure_mapboxr   DensitymapboxZ
Scattergeoconfigure_geor   
cartesiansconfigure_cartesian_axes)rh   rc   rX   ordersZconfiguratorsr   rL   rL   rM   configure_axes  s>                 
r   c                 C   s   d| }d| }|| krP| | rPd|d< || krl| | rldd | | D |d< n|| krl| | rl| | |d< | | |krd|d	< t |tjjr|| |  ntt|| |  |d
< d S )Nlog_range_logr   c                 S   s   g | ]}t |d qS 
   mathr  )rk   r   rL   rL   rM   r   0  s     z+set_cartesian_axis_opts.<locals>.<listcomp>r   r   categoryordercategoryarray)r   r   layoutZXAxislistreversed)rh   r   r   r   Zlog_keyZ	range_keyrL   rL   rM   set_cartesian_axis_opts*  s    r  c                 C   s  d| d | d fkrd|j d< t|j}t|jd }|jddD ]}t| |d	| qB|jdd
D ]}t| |d| qb| d r|jdddd |d | d j jjd kr|j| d dk|d | d j j	jd kr|j
d|d | d rD|j
dddd |d | d j j	jd kr"|j
| d dk|d | d j jjd krD|jd|d t| | d	 d	}| d rp|j|ddd n&td|d D ]}|j||dd q~t| | d d}	| d r|j
|	ddd n&td|d D ]}
|j
|	d|
d qd| kr| d r|j
dd d| kr(| d r(|jdd d	t|d  }| d rjtd|d dD ]}|j|d |d qR| d rtd|d dD ]}
|j
dd |
d qd S )N	histogramr   r   overlaybarmoder   r   r   r   r   r   Fr   )showticklabelsshowlineticksr   r   r9   )showgridr   T)r  r  r  r   r   )r  r   )
title_textr   r   log_xr  r   log_y   )r   r   r   x2)r   r   r   )r
  r   	_grid_refselect_yaxesr  select_xaxesupdate_yaxesyaxisr  xaxisupdate_xaxesr   r   r   )rh   rX   r   nrowsncolsr!  r"  y_titler   x_titler   Z	matches_yrL   rL   rM   !configure_cartesian_marginal_axes=  sj    

    
    



r(  c                 C   s2  d| kr| d s d| kr0| d r0t | || d S t| | d d}|jddD ]}|j|d t| |d| qLt| | d d}|jddD ]&}d	| kr|j|d t| |d| qd
| kr| d
 r|jdd d| kr| d r|jdd d	| kr|jdd d| kr.| d dkr"|jdd n|jdd d S )Nr   r   r   r   r  r  r   r  is_timeliner  r  r  r  dateecdfmoderw   ry   Ztozero)Z	rangemode)r(  r   r  r   r  r  r#  r   )rh   rX   r   r&  r!  r'  r"  rL   rL   rM   r     s4    
r   c                 C   sD   |j tt| | d dtt| | d dtt| | d dd d S )Nr   r)  r   r   )ZaaxisZbaxisZcaxis)Zupdate_ternariesr   rj   rh   rX   r   rL   rL   rM   r     s
    r   c                 C   s   t t | d | d dt  d}dD ]4\}}| | |kr"d|| d< || |  || d< q"|d	 }| d
 rd|d< | d rdd | d D |d< n| d r| d |d< | d r| d |d< || d S )N	directionZstart_angle)r.  Zrotation)angularaxis
radialaxis))r   r0  )r   r/  r   r  r	  r0  Zlog_rr  r   Zrange_rc                 S   s   g | ]}t |d qS r  r  rk   r   rL   rL   rM   r     s     z(configure_polar_axes.<locals>.<listcomp>r   Zrange_thetaZsector)r   Zupdate_polars)rh   rX   r   patchvarr   r0  rL   rL   rM   r     s$    r   c                 C   s   t t t| | d dt t| | d dt t| | d dd}dD ]}||d  }| d|  rd	|d
< | d|  rdd | d|  D |d< n| d|  r| d|  |d< | | |krBd|d< || |  |d< qB|| d S )Nr   r)  r   r   )r"  r!  Zzaxis)r   r   r   r   r  r  r   r  c                 S   s   g | ]}t |d qS r  r  r1  rL   rL   rM   r     s     z%configure_3d_axes.<locals>.<listcomp>r   r   r  r	  )r   rj   Zupdate_scenes)rh   rX   r   r2  r   r   rL   rL   rM   r     s"    r   c                 C   sf   | d }|sHd| krHd| krHt | d | d   | d | d   d}|jt|| d | d d d S )	Ncenterr'   r(   r   r'   r(   zoomZmapbox_style)Zaccesstokenr4  r6  style)r   meanZupdate_mapboxesrT   rh   rX   r   r4  rL   rL   rM   r     s    r   c                 C   sd   | d }|sHd| krHd| krHt | d | d   | d | d   d}|j|| d | d d d S )	Nr4  r'   r(   r   r5  r6  Z	map_style)r4  r6  r7  )r   r8  Zupdate_mapsr9  rL   rL   rM   r     s    r   c                 C   s2   |j | d | d | d | d t| d dd d S )Nr4  scope	fitboundsZbasemap_visible
projectionr  )r4  r:  r;  Zvisibler<  )Zupdate_geosr   r-  rL   rL   rM   r     s    r   c                    s    fddd| kr| d rt |jdkrd dgdddd gd	gd
ddgddddddddd	dd	g|j_d	dddt| | d d idddddd	fdd|jD d	g|j_d S )Nc                    s    |  t jkddd| dddS )N)durationZredrawZ	immediateTZlinear)r=  Zeasing)framemodeZfromcurrentZ
transition)r   Scatter)r=  )rc   rL   rM   
frame_args  s
    z0configure_animation_controls.<locals>.frame_argsr0   r   i  z&#9654;animaterh   r   methodr   z&#9724;leftr  F   )r   tFbuttonsg?righttop)	rH  r.  padZ
showactiver   r   xanchorr   yanchorprefixr   <   )r   rG  g?c                    s&   g | ]}|j g d g|j ddqS )r   rB  rC  r   rk   f)rA  rL   rM   r   3  s
   z0configure_animation_controls.<locals>.<listcomp>)	activerM  rL  ZcurrentvaluerK  r   r   r   Zsteps)r   framesr
  Zupdatemenusrj   Zsliders)rh   rc   rX   rL   )rc   rA  rM   configure_animation_controls  sH    
 
rU  c           
      C   sP  |t jt jfkrd| kr| d dksZ| d dkrt| d dkr| ddkr| d d kr|t jkrzt j}d	|kr|d	= nt j}t|||d g}d
D ]}d| | kr| d|  rd }t|dkrdnd|dkrdndd}| d|  dkrtt j	|d| gtf d|d||d}n| d|  dkrJtt j
|ddgt|d|d}n| d|  dkr|tt j|ddgtdd|d}nP| d|  dkrdd d
}tt j|ddgtd!d"d!id#d$d%d&|| id'|d}d"|ksd"| krd(|jkrt |jd(< | d) d$ }	|	|jd( d"< || q| d*rL| d+d,d,krL|t| | |S )-NZrender_modeZwebglautor   r   
line_shapeZspliner0   rw   r   Z	marginal_r   x1r  r   y1y2)r"  r!  r        ?)opacitybingrouprc   rd   re   rf   Zviolinr    r-   )Z
scalegroupZboxT)ZnotchedZrugzline-ns-openzline-ew-openzrgba(255,255,255,0)r4   allr   Zpointsr5   )Z	fillcolorr   Z	boxpointsjitterZhoveronr   r   r>   r   trendline_scoper   )r   r@  r   r   r   	Scatterglr   rb   r   r   ViolinBoxre   r   make_trendline_spec)
rh   rc   rd   re   resultr   r   Zaxis_mapsymbolsZfirst_default_colorrL   rL   rM   make_trace_spec?  s    


	




rh  c                 C   sJ   t |tjkrtjntjdgtddd d}| d rFt| d d|jd< |S )Nr   lines)r?  r^  Ztrendline_color_overrider4   r   )rb   r   rb  r@  r   re   )rh   rc   r   rL   rL   rM   re    s    re  c                 C   s   dS Nr   rL   r   rL   rL   rM   	one_group  s    rm  c                 C   s  t jD ]&}|| kr| | d krtt || |< q| d d kr\tjjd k	rTtjj| d< nd| d< ztj| d  | d< W n( tk
r   tj	| d | d< Y nX d| kr| d d kr| d jj
jrdd | d jj
jD | d< | d d krtj| d< d| kr>| d d kr&| d jjr&| d jj| d< | d d kr>tj| d< d| kr| d d kr~| d jjr~dd | d jjD | d< | d rt| d sd	d
dddg| d< d| kr| d d kr| d jjrdd | d jjD | d< | d r t| d sddddddg| d< d| kr| d d krT| d jjrTdd | d jjD | d< | d rlt| d sddddddg| d< d S )Nr9   Zplotlyr>   c                 S   s   g | ]}|d  qS r   rL   r1  rL   rL   rM   r     s    z)apply_default_cascade.<locals>.<listcomp>r<   r?   c                 S   s   g | ]}|j jqS rL   )r   r5   rk   scatterrL   rL   rM   r     s    ZcircleZdiamondZsquarer   ZcrossrA   c                 S   s   g | ]}|j jqS rL   )r   r   ro  rL   rL   rM   r     s    Zsoliddotr   ZlongdashZdashdotZlongdashdotrC   c                 S   s   g | ]}|j jjqS rL   )r   r   r   )rk   barrL   rL   rM   r     s    r   /\+r   )defaultsrS   getattrpioZ	templatesdefaultrg   r   r
  Template
colorscaler   ZViridisZcolorwayr   ZD3datarp  anyrr  )rh   paramrL   rL   rM   apply_default_cascade  sn    











	


r  c                 C   s    | |kr| S t d| | f d S )NzaA name conflict was encountered for argument '%s'. A column or index with name '%s' is ambiguous.)	NameError)
field_namereserved_namesrL   rL   rM   _check_name_not_reserved  s    r  c                 C   s   | d }t  }| D ]}|tkr q|tkr0| | n| | g}|dkrDq|D ]}|dkrXqHqHt|trn|| qHt|tjr|j}|rt	||r||| k}|r|| qH||j
krH|jdk	rH||j qHq|S )z
    This function builds a list of columns of the data_frame argument used
    as arguments, either as str/int arguments or given as columns
    (pandas series type).
    r   N)setall_attrablesarray_attrablesr   r   addr   Seriesr   hasattrr   )rh   rs   r  fieldr"   argr   Zin_dfrL   rL   rM   _get_reserved_col_names  s,    
r  c              	   C   s   |dkst |tst |tr dS t |tjr0dS zt| W n tk
rR   Y dS X |D ]V}t |tspt |tr| dks|| kr dS qXzt| W qX tk
r   Y  dS X qXdS )zReturns True if arg looks like it's a list of columns or references to columns
    in df_input, and False otherwise (in which case it's assumed to be a single column
    or reference to a column).
    NFT)r   r   intr   
MultiIndexiter	TypeError)columnsr  r   rL   rL   rM   _is_col_list  s"    r  c                 C   s>   t | ts2t | tr t| dks2t | ts2| dkr6dS dS dS )zReturns True if x is an iterable which can be transformed into a pandas Series,
    False for the other types of possible values of a `hover_data` dict.
    A tuple of length 2 is a special case corresponding to a (format, data) tuple.
    r  NFT)r   r   tupler   boolrl  rL   rL   rM   _isinstance_listlike,  s    
r  c                 C   s&   | d k	r"|| ks||kr"d| }q |S )Nr   rL   )r  rt   extrarL   rL   rM   _escape_col_name<  s    
r  c                 C   s   t j| |djddS )aU  
    assuming x is list-like or even an existing pd.Series, return a new pd.Series with
    no index, without extracting the data from an existing Series via numpy, which
    seems to mangle datetime columns. Stripping the index from existing pd.Series is
    required to get things to match up right in the new DataFrame we're building
    rP  T)Zdrop)r   r  reset_index)r   r   rL   rL   rM   to_unindexed_seriesB  s    r  c              
      sr  | d }|dk	}i }i  g }t  }|r.t| nt  }	d| krh| d dkrh|sVtdndd | D }d| ko| d ot| d t}
|
r| d D ]}t| d | rd| d | f| d |< t| d | ts| d | df| d |< |r| d | d	 dk	r||krtd
| qtD ]t	kr8| 
gn| 
}|dks|dgkr\qt	krlgnfddtt|D }tt||D ]p\}\}}t|rt|tt| nd|dkrҐqd}t|tjrtd| t|tst|trNt|jdk	r t|jn||	}t|tr@|j |< n
|| nRt|tsft|dsdkr|
r| d t| d	 dk	rt|}| d | d	 }rt|krtd|t|tt| f t||||< n|std| n||jkr^|r*|||fkr*qn2d|tt|j|f }|dkrT|d7 }t|n\rt|| krtd|t|| tt| f nt|}t|| |||< n|r>t|dr>||j kr|j!dks|j!|krd}n|j!}t"||||g}n.|j!dk	r>|j!|kr>|||j! kr>|j!}|dkrRt||	}rt|krtd|t|tt| f t|t||t|< |dk	st#dt	krt|| < n"t|  trnt||  |< dkr|$t| qqt|r*t|tt| nd|%fdd|D  |% fdd D  t&|}||fS )ac  
    After this function runs, the `all_attrables` keys of `args` all contain only
    references to columns of `df_output`. This function handles the extraction of data
    from `args["attrable"]` and column-name-generation as appropriate, and adds the
    data to `df_output` and then replaces `args["attrable"]` with the appropriate
    reference.
    r   Nr+   zjNo data were provided. Please provide data either with the `data_frame` or with the `dimensions` argument.c                 S   s   i | ]\}}||qS rL   rL   )rk   r   ZseriesrL   rL   rM   rn   h  s      z/process_args_into_dataframe.<locals>.<dictcomp>r-   Tr   zIAmbiguous input: values for '%s' appear both in hover_data and data_framec                    s   g | ]} d  t | qS )r   r   r   )r  rL   rM   r     s     z/process_args_into_dataframe.<locals>.<listcomp>r   ziArgument '%s' is a pandas MultiIndex. pandas MultiIndex is not supported by plotly express at the moment.__len__zAll arguments should have the same length. The length of hover_data key `%s` is %d, whereas the length of previously-processed arguments %s is %dzString or int arguments are only possible when a DataFrame or an array is provided in the `data_frame` argument. No DataFrame was provided, but argument '%s' is of type str or int.z^Value of '%s' is not the name of a column in 'data_frame'. Expected one of %s but received: %sr   z6
 To use the index, pass it in directly as `df.index`.zAll arguments should have the same length. The length of column argument `df[%s]` is %d, whereas the length of  previously-processed arguments %s is %dr   zAll arguments should have the same length. The length of argument `%s` is %d, whereas the length of  previously-processed arguments %s is %dzData-frame processing failure, likely due to a internal bug. Please report this to https://github.com/plotly/plotly.py/issues/new and we will try to replicate and fix it.r/   c                    s   i | ]}|t t |qS rL   )r  r   rk   rt   )lengthrL   rM   rn     s      c                    s"   i | ]}|t  | g |qS rL   )r  r  )	constantsr  rL   rM   rn     s    )'r  r  r   ro   r   r   r  r  r  r  r   r   r   	enumeratezipnextr  r   r  r  r   r   r  r   r   rm   r   r  r  keysr  r  r   r   r  r   r  r   	DataFrame)rh   	wide_modevar_name
value_namedf_inputdf_provided	df_outputrangeswide_id_varsr  Zhover_data_is_dictr   Zargument_listZ
field_listr   argumentr  rt   Zreal_argumenterr_msgrL   )r  r  r  rM   process_args_into_dataframeL  s<   	 

"



 
  



"
r  c               
      s.
  | D ]n}|t kr| | dk	rt| | tr<t| | | |< q|dkrbt| | trb| | g| |< qt| | | |< q| d dk	}d}|rt| d tjst| d drt	tj
t	dkrddl}| d }| | d< t| d   d}nt| d d	r | d  | d< | d j ntt| d d
rL| d  | d< | d j nHt| d drx| d  | d< | d j nt| d | d< | d j n|r| d j nd | d }| ddk}| ddk}	|rdnt | d }
|	rdnt | d }d}d}d}d}tjtjg}|tjkp.d| k}|tkr|
rN|rNtd|r|r|	rd}t tjrztdt | d< t tjr j}nd}|dks| krd}|tjkr| dpd}n| dpd}|| d< d| d< n|
|krd}|r| d n| d | d< |r:| d  kr: j}t| d tjr\t| d | d< |dksv|rz| krzd}|r|
rdnd}n|rdnd}d| |rdnd< d| d< |s|	s|rdnd}|rt dg }t |g }|rz|st| d ds&tj j!"| d | d< nz fdd| # D }| D ]:}| | dk	r@|t kr@|$ fdd| | D  q@t| tj j!"| d % | d< W nz t&t'fk
r } zVt|d
r| | d< n8t|dr| | d< nt|d	r| | d< n|W 5 d}~X Y nX | d }d}|tj(tj)tjg| kr@|s@|s||	krd D ]b}| |dkr^|r~|j*nt+ | |< |tj)kr|}n$| d dkr^|dkrdnd| d< q^|r@|dkr@||	kr| d dkr|rdnd| d< |r&t|j*tjrtd!|j*| d< nt+t|d"||gd#| d< d}t,| d$tkrr| d$ t-krrd}d| d$< t.| |||\}t|d%||g}|s|r|tj)kr|dkrdnd}t/|| | s|| |< d&||< n$| d dkr|dkrdnd| d< ||kr| d= |	rfd'd(| d D }| d= |dkrJ| d }n|dkr^| d }n| d }| d= d}|D ]F}|| j0j1}|d)krd*n|}|dkr|}n||krttd+qt|j2|||d,}t3|jt3t4|jkst5d-|| 6t||< |dk}|rJ|| |rdnd< || |r0dnd< | d$ p@|| d$< nB|tj(tjg| kr|| |rndnd< || |rdnd< |tjkr| d$ p|| d$< d.| k	r| d. p|| d.< n|tj)k	rPt/||	r|| |rdnd< || |rdnd< | d$ 	p|| d$< n>|| |	rdnd< || |	r0dnd< d&||< | d$ 	pH|| d$< n<|tj7tj8fk	r|	pj|| |	rvdnd< || |	rdnd< |
r|tj(k
r| d dk		r| d dk		rd/| d0< nP| d dk	rd| d0< d| d< || d< d&||< n d| d0< d| d< || d< d&||< |
r"d| d$< || d< | S )1a  
    Constructs a dataframe and modifies `args` in-place.

    The argument values in `args` can be either strings corresponding to
    existing columns of a dataframe, or data arrays (lists, numpy arrays,
    pandas columns, series).

    Parameters
    ----------
    args : OrderedDict
        arguments passed to the px function and subsequently modified
    constructor : graph_object trace class
        the trace type selected for this figure
    N)r,   r-   r   F__dataframe__z2.0.2r   T	to_pandastoPandasto_pandas_dfr   r   r,  zPCannot accept list of column references or list of columns for both `x` and `y`.znData frame columns is a pandas MultiIndex. pandas MultiIndex is not supported by plotly express at the moment.r/   )Nrm   r   r`   rw   rx   ry   r%   Z__x__Z__y__rm   select_columns_by_namec                    s"   h | ]}t |tr| kr|qS rL   )r   r   r   r  rL   rM   	<setcomp>  s    
  z"build_dataframe.<locals>.<setcomp>c                 3   s   | ]}| kr|V  qd S rH   rL   r   r  rL   rM   	<genexpr>  s      z"build_dataframe.<locals>.<genexpr>r   zlData frame index is a pandas MultiIndex. pandas MultiIndex is not supported by plotly express at the moment.r   )r   r4   rz   r   c                    s   g | ]}| kr|qS rL   rL   )rk   r   )r  rL   rM   r     s      z#build_dataframe.<locals>.<listcomp>)r   rR  unumberzLPlotly Express cannot process wide-form data with columns of different type.)Zid_varsZ
value_varsr  r  zWide-mode name-inference failure, likely due to a internal bug. Please report this to https://github.com/plotly/plotly.py/issues/new and we will try to replicate and fix it.r3   r|   rv   )9r  r   r   r   r  r   r  r  r   parse__version__Zpandas.api.interchanger  ZIndexZcolumn_namesr  r  r  r  r   r  r   r   r   r   r   r   r  r  r   Funnelr  apiZinterchangeZfrom_dataframer#   r   r  ImportErrorNotImplementedErrorr@  Barr   r   r   NO_COLORr  ru   rq   rr   Zmeltr   r  r   r   rc  rd  ) rh   rc   r  r  Zneeds_interchangingpandasZdf_not_pandasr  Zno_xZno_yZwide_xZwide_yr  r  Zwide_cross_namer  Zhist2d_typesZhist1d_orientationZwide_orientationZnecessary_columnsexcZmissing_bar_dimZaxno_colorr  Z
count_nameZ	other_dimZwide_value_varsrq   ry   Zv_dtypeZorient_vrL   )r  r  rM   build_dataframe"  s   
 





 
"   










r  c                 C   s   | j t| jd}| }|t}t|jddj	d }|D ]B}|j
| }t|j	d d }||d   s@td|j
| q@d||< t|jdd dd}t|d d	 D ]:\}}||d  |kr|d |krtd
|j
|d  dqd S )Nr   r   )r   r   z*None entries cannot have not-None childrenr   c                 S   s
   d | S rk  )r   rl  rL   rL   rM   r   e  r   z-_check_dataframe_all_leaves.<locals>.<lambda>z4Non-leaves rows are not permitted in the dataframe 
zis not a leaf.)r   r  r  Zisnullr   r   r   Znonzeror}  r#   r   r_  r   applyr  )rs   Z	df_sortedZ	null_maskZnull_indicesZnull_row_indexr   r   Zrow_stringsrL   rL   rM   _check_dataframe_all_leavesW  s*    

r  c                    s(  | d | d ddd }t |ddd   d}g }|D ]"}|d }|| | |< q<|}dd }i }d}| d	 rzt| d	  | d	 < W n$ tk
r   td
| d	  Y nX | d r| d | d	 kr| d	 d }	| d	  |	< |	| d	< | d	  n:djkrdnddd tjD  d <  | d	< d| < | d rt| d sn|}d}n fdd}
|
}||| d < tt	j
|}|D ]}||kr|||< qtt	|t	dddg }tjdddg| d}|D ]}|| | j||< qt|D ]$\}}tj|jd}||d |}| }||  t|d< d|d< ||  t|d< |t|d k r|d }|t|k r|||   td |d  |d< |||   td |d  |d< |d7 }q|d jd|d< |r,|| ||< tj||gdd}q| d r|rd}||jkrn|d7 }qV| d  t||< |j|d}|| d< d| d< d| d< d| d < d| d!< | d r$| d" s| d g| d"< nHt| d" tr| d" | d s$d#| d" | d < n| d" | d  | S )$z^
    Build dataframe for sunburst, treemap, or icicle when the path argument is provided.
    r   r.   Nr  FZ
_path_copyc                 S   s$   |   }t|dkr|d S dS d S )Nr   r   z(?))r   r   )r   uniquesrL   rL   rM   aggfunc_discrete  s    z5process_dataframe_hierarchy.<locals>.aggfunc_discreter#   zDColumn `%s` of `df` could not be converted to a numerical data type.r4   Z_sumrz   r   c                 S   s   g | ]}t |qS rL   r  )rk   elrL   rL   rM   r     s     z/process_dataframe_hierarchy.<locals>.<listcomp>r   r|   Tc                    s   t j| j| j f dS )N)weights)r   Zaveragelocr   rl  Zcount_colnamers   rL   rM   aggfunc_continuous  s    z7process_dataframe_hierarchy.<locals>.aggfunc_continuousrG   r   r   r  rs  )Zignore_indexZsort_color_if_discrete_color0r   r&   r"   r$   r-   )TN)r  r   r   Z
to_numericr   r  r   r  ru   r  
differencer  r   rq   r  groupbyZaggr  r   r   r   rstripr   r   r   r   r   )rh   r.   Zdiscrete_colornew_pathrt   Znew_col_namer  Zagg_fZaggfunc_colorZnew_value_col_namer  colsr   Zdf_all_treesr   levelZdf_treeZdfgjZsort_col_namerL   r  rM   process_dataframe_hierarchyo  s    





 &

r  c              	   C   s   d| d< | d dks | d dkr(t dz0t| d | d  }t| d | d  }W n  t tfk
rx   tdY nX || d	td
d | d | d < | d | d< | d= | d | d< | d= | S )z8
    Massage input for bar traces for px.timeline()
    Tr*  r   Nr   z#Both x_start and x_end are requiredr   zCBoth x_start and x_end must refer to data convertible to datetimes.ztimedelta64[ns]r   msr   r   )r   r   Zto_datetimer  r   r   Ztimedelta64)rh   r   r   rL   rL   rM   process_dataframe_timeline  s(    

r  c                    s   |  d}|d kr| |fS | d  |i  }|s:| |fS | d }d|d< d|d< t||    fdd	tt|  D }||j|  | d< | |fS )
Nr"   rF   r   FsortZ	clockwiser.  c                    s   g | ]}| kr|qS rL   rL   r1  r  rL   rM   r     s      z)process_dataframe_pie.<locals>.<listcomp>)	r   r   r  r   r   fromkeysZ	set_indexr  r  )rh   re   r"   Zorder_inrs   orderrL   r  rM   process_dataframe_pie  s    
 r  c                    s   fddt t D }g }d}d krN d rN d  d    d d  }d krd	 krd
 krt|d n` d rt d  d r|d d d< n2|tjtjtjfkr|d d d< n
|d nxd ks|tj	kr|d nZ|tj
tjfkrD|d  d rN d d kr0g  d<  d  d  n
|d td|ko d o|tj
tjfko|tjtjtjfkp d}nd}d kr|d d kr|d d kr|tjfkr|d n
|d d kr4 d d k	} d d k	}	 d d krz|tjtjfkrL|	rz|szd d< n.|tjtjtjtjfkrz|rz|	szd d<  d d kr|r|	rt d  d }
t d  d }|
r|sd d< |r|
sd d<  d d krd d< |tjkr~|r,|	r, d d kr,d  d< |d<  d } d  }|dkrJ|nd |d!< |dkr`d n||d"< |dkrvdnd|d#<  d |d< |tjtjfkr4|tjkrd$nd%}|| d kr d d k	r d  d kr d dkrd&||< n( d  d kr d dkrd&||< || d kr4d'||< |tjkrl d( d k	rl d d krld  d< |d<  d)ddk	r|tjtj	fkrd(}n(|tjkr d dkrdnd}nd*} d) dkrd+| d, |d-< nd+| d.  d)  d, |d-< |tjtjtjfkrd}d/|d0< d1 kr d1 d kr\d2 kr d2 d&krtd3d4|d5< n>|tjtjtj
tjtjfkr d1 |d1< nt d1 d4|d5< d ksd kr<t } d6dr|d6  d7s ds d8r|d8  d7r|d7 t|dkr(|d6 d9t||d:< nB|tjkr~d ksd|tjtjfkr~d8 d7 rtd;nd< |d:< d= krt d= d>|d?< n*d@ krt d@ dAkrdBndCd>|d?< dD kr dE |dE< t  dD dFs dD n dD j!|dD< dG krL d dkrdHndI} d dkr4dHndI} dG  |< d  |< t d dkrnd   dJ<  dK<  dKd k	r dId k	rd  dI<  dJd k	r dHd k	rd  dH<  dHd k	s dId k	s dJd k	rd dL< dM kr4 dM d k	r4 dM t"kr4t#dN dM t"$ f dO krV dO d krVt  dO< dP kr dPd dQkrt#dRdS dP    dP  dT< t%D ]}| kr|| q fdUd|D }t& |||}||||fS )VNc                    s   g | ]}| kr|qS rL   rL   )rk   r   r   rL   rM   r     s      z infer_config.<locals>.<listcomp>r   r   r   rE   r  r4   r>   r<   Tr   Fzmarker.colorr3   z
line.colorr-   r6   z	line.dashr5   zmarker.symbolr7   zfillpattern.shapezmarker.pattern.shaperw   r   r   rx   ry   rv   r|   nbinsZnbinsxZnbinsyr]  ZboxmodeZ
violinmoder  groupr   Z	text_autorm   z%{r   Ztexttemplate:r   r   r\  r  r[  )r\  r   ri  r!   markersru  r?  z+textr   rW  )r   r   r,  r  ZvhZhvZgeojsonZfeatureidkey__geo_interface__rf   r   r   r1   r2   facet_col_wrapr   z,Value '%s' for `trendline` must be one of %sr   ecdfnorm)Nr   r}   z<`ecdfnorm` must be one of None, 'percent' or 'probability'. z'%s' was provided.r{   c                    s   g | ]}t  |qS rL   )r   )rk   r   r   rL   rM   r     s     )'direct_attrablesr  maxr   ru   r   r   r   r   r   r   r   r  r   r@  r   rc  rd  r  r  r   r   r   r   r  r  r   r   sortedr   r   r   r  r  r   r   r  group_attrablesrh  )rh   rc   re   layout_patchrd   Zgrouped_attrsr   show_colorbarZhas_xZhas_yZx_is_continuousZy_is_continuousrw   r  r?  r   modesr   Zother_positionr   grouped_mappingstrace_specsrL   r   rM   infer_config  sr    

















 
 



$







  



r  c                    s  d| kri n
| d   g }t }|D ]  tkr>|d q& |kr^t| d    | < |  }t|dkr||d   kr| < q&ttt  |  < q&| d }t|t|krt	||i}n"dd |D |j
dd	d
}|j}fdd|D }	tttD ]"\ t|	 fddd}	q dd |	D }
t|D ],\  tkrZ|
D ]}|d qpqZdd |
D }
i }t|
|	D ]V\}}t|dkr||||< n.tr||d f||< n||d ||< q|fS )a  
    `orders` is the user-supplied ordering with the remaining data-frame-supplied
    ordering appended if the column is used for grouping. It includes anything the user
    gave, for any variable, including values not present in the dataset. It's a dict
    where the keys are e.g. "x" or "color"

    `groups` is the dicts of groups, ordered by the order above. Its keys are
    tuples like [("value1", ""), ("value2", "")] where each tuple contains the name
    of a single dimension-group
    rF   r   r   r   r   c                 S   s   g | ]}|t kr|qS rL   )rm  rk   grL   rL   rM   r     s      z)get_groups_and_orders.<locals>.<listcomp>FT)r  Zobservedc                    s"   g | ]}t  d kr|n|fqS rn  )r   r  )required_grouperrL   rM   r   "  s    c                    s&   |    kr"   |  S dS )Nr  r   )r  )r   r   r   rL   rM   r   )  r   z'get_groups_and_orders.<locals>.<lambda>rl   c                 S   s   g | ]}t |qS rL   )r  )rk   rG  rL   rL   rM   r   -  s     c                 S   s   g | ]}t |qS rL   )r  r  rL   rL   rM   r   2  s     )r   r   rm  r   r  r   r   r   r  r  r  indicesr  r  r  insertr  Z	get_grouppandas_2_2_0)rh   r\   Zsingle_group_nameZunique_cacher  rs   groupsZgroupedZgroup_indicesZsorted_group_namesZfull_sorted_group_namesr  ZsfsrL   )r   r   r   r  rM   get_groups_and_orders  s\    
   


r  c           4         sf
  |pi }|pi }t   t | |tjtjtjfkrJ d d k	rJt  |tjfkrdt |\ }|dkrztj	}t
  t |||\}}}}dd |D ptg}t |\}	g }
g }d }}|D ]}|jkr|jd |jd< qƈ|j }|jdkr(t  d	 d
 fdd|D }
t|
}|jdkr`t  d d
 fdd|D }t|}|D ]2}||jkrd|jt|jt|j  |j|< qdqt| j}i }t }g }d } dd}|	 D ]\}}t }t }d}t|||D ]^\}}}|tkrt |}t|jts>t|||< |jr>t|||< |jdkr|}qd|  }||krtt! ||< || }|D ].}|j"|d} |j"tj#tj$tj%tj&tj'tj(tj)tj*tjtjtjfkr| j+||dko||kd |j"tj	tj,tj-tj.fkr| j+d|d |/| d| _0d| _1t2|D ]\}!}||! }z|3| |j|  W n t4k
rL   ||d kr|j"tj,tj-fkr|jdksH|j"tj.fkr|jdkrn||d kr|j"tj.fkr|jdkr| j+t5|j| dd nP|j"tj%tj&tj'fkrF|jdkrF| j+dgt| |j| gd ddd n Y nX |jdkrf|j| }"n& dd k	r|j6dkrd}"nd}"|jdkr|j| }|rd|d |  }"d|d |  }n|j6d krd}nd}|"dkr|"| _0|dkr.|| _1q.|d j"tj7krD|j"tj-krD| j8j9rD| j+t5| j8j9dd d! kr< d" d#krd d n d  }# d" d$kr d n d  }$ d!d%d&k}%|j:|#|%d'}||$ ; }&||$ < ||$< |%s|j:|#dd'} d!d%d(kr|&||$  ||$<  d) d*kr||$ |& ||$< n" d) d+kr<d,||$  |& ||$< t= |||> |\}'}(| +|' |(d k	r|?|>  |(|d- d.< ||krt5g |d/||< || d0 ?|  qqd1d |  D })t|)dkrt@|) fd2d3d4})|rj|tj*tj(tj)fkrd5nd}* d6 p d d g}+tAd7d8},t5|,B d9  d: |+d |+d t5tC  |* |*d;d<|d=< d>D ]}- |- rn |- ||-< qnt5dd?|d@< |rd||d@ dA<  dB rʈ dB |dA< n  dC jDjEjFd krdDdEi|dF< dG kr dG r dC jDjGjHd krdH|d@ dI< |r<tIJ|| }tK||} dd k	rT|d7 } dJd k	rl|d7 }tL ||)|||
|}.|)D ]H}/|/d0 D ]8} t| tjMrqtN| |.jD|.jO|| j0 d | j1 qq|.Pt|)dkr|)d d0 ng  |.Q| dC k	r& dC d k		r&|.jQ dC ddK |)D ]}0t|0dL |0dL< 	q*t|dk	rT|)ng |._R dM
r< dNdOdPk
r<tS |}1|1j"dQdQddR}2dS|1jTk	r|D ]<}|jdk	r|jt|jt|j  }3t5|3d|1jTdS< 	qt= |1 dT i |\}'}(|2+|' |.jU|2dUdUddV |.jVd-ddW |(d k	
r<|?t5|(dX tWX||._YtZ ||. t[ ||. |.S )YNr.   Ztimelinec                 S   s   g | ]}|j ptqS rL   )r\   rm  r1  rL   rL   rM   r   Q  s     zmake_figure.<locals>.<listcomp>r   r   r   r   r2   r   c                    s   g | ]} t | qS rL   r  rk   r  rN  rL   rM   r   ^  s     r   r1   c                    s   g | ]} t | qS rL   r  r  r  rL   rM   r   b  s     r  r0   z, rP  )legendgroup
showlegendT)ZalignmentgroupZoffsetgroup)r5   r   r   )r5   r   r4   rj  )r   r  F)r   r{  Z	showscaler  r   r   r   r,  rw   ry   rx   standardr  )r   	ascendingZcomplementaryr  r}   r   g      Y@r  px_fit_results)r|  r   r|  c                 S   s   g | ]}|qS rL   rL   rQ  rL   rL   rM   r   	  s     c                    s    d   | d S )Nr0   r   r  )rR  )rh   r   rL   rM   r   	  r   zmake_figure.<locals>.<lambda>r  r   range_colorr{  make_figurer>   Zcolor_continuous_midpointr)  )r{  ZcmidZcminZcmaxZcolorbarr   )r;   r:   )Ztracegroupgaplegendr  titler9   rG  rO  marginr   Zconstant
itemsizingr   )r9   	overwriter   r   ra  r   ZoverallzOverall Trendline)r   r  r  r   r   r_  )r   r   Zexclude_empty_subplots)selectorr  )r  )\r  r  r   r   r   r   r  r   r  r  r  r  rm  r  r\   r^   r]   ra   rj   r   r   r   r   r   ro   r  r   r   r   r[   r`   r   r#   r  rc   r   r   r   r   r   r   r   r   r   rc  rd  r   r  Z_subplot_rowZ_subplot_colr  r_   r   r   rf   r   r   r4   r   r|   Zcumsumr   r   r   r  r   Zvalidate_coercer   r
  r  rG  r  r  r  ceilmininit_figurer   r   r  Z
add_tracesZupdate_layoutrT  re  re   Z	add_traceZupdate_tracesr   r  rW   r   rU  )4rh   rc   re   r  r  r  r   r  r\   r  
col_labels
row_labelsr$  r%  mZsorted_valuesvalsubplot_typeZtrace_names_by_framerT  Ztrendline_rowsZtrace_name_labelsr  Z
group_namer  r   Z
frame_namer   rl   Z
trace_nameZtrace_namesr   r   r   r   r   r3  r   Z	group_sumr2  r   
frame_listZcolorvarr  Zcolorscale_validatorry   rX   r>  rR  Ztrendline_specZtrendline_traceZ
next_colorrL   )rh   r   rN  rM   r  @  s8   
    

&













    


 




      	$

      
   
r  c                    s~   fddt |D }dg  }dg| }	| dd}
dkr| dd k	r| d dksld	| krr| d	 rrd
}nd}|g|d  d| g }	d}n"|
r| dpd}n| dpd}| dd k	r
| d dksd	| kr| d	 rd
}nd}|g d  d| g }d}n| dpd}n8|
r4| dp0d}n| dpBd}| dpRd}|
rd g|   }t||  k r|d  qht |D ]:}t  D ]*}||d |   |  ||  | < qqdd }zLt| |dd|
rg n
tt||
r g n||
r|ng |||	|dd}W n< tk
r\ } z||dd ||dd W 5 d }~X Y nX |jj	D ]}|j
d d qf|S )Nc                    s    g | ]}t pd dg  qS )domainr  )r   )rk   r   r%  r  rL   rM   r   r	  s     zinit_figure.<locals>.<listcomp>g      ?r  r   Zxyr   r  r4   gGz?gzG?r   g{Gz?Zfacet_row_spacinggQ?gQ?r   g{Gzt?Zfacet_col_spacingg{Gz?c                 S   s6   d|f | j d kr2| j d dj|d f| _ | dS )z
        Translates the spacing errors thrown by the underlying make_subplots
        routine into one that describes an argument adjustable through px.
        z
%s spacingr   z5
Use the {facet_arg} argument to adjust this spacing.)	facet_argN)rh   format)er.  r  rL   rL   rM   _spacing_error_translator	  s    z.init_figure.<locals>._spacing_error_translatorr_  zbottom-left)Zrowsr  specsZshared_xaxesZshared_yaxesZ
row_titlesZcolumn_titlesZsubplot_titleshorizontal_spacingvertical_spacingrow_heightscolumn_widthsZ
start_cellZ
HorizontalZVertical)font)r   r   r   r   r   r  r  r   r
  annotationsr   )rh   r  r  r$  r%  r  r  r  r  r  r  Z	main_sizer  r  Zsubplot_labelsr   r  r  rX   r  ZannotrL   r  rM   r  p	  sn    


,
r  )N)NN)dZplotly.graph_objsZ
graph_objsr   Z	plotly.ioiorx  collectionsr   r   Z_special_inputsr   r   r   r   r   r	   r
   r   r   Z_plotly_utils.basevalidatorsr   Zplotly.colorsr   r   r  	packagingr   r  r   Znumpyr   Zplotly._subplotsr   r   r   r  r  r  r  r   r  r  r  Zrenameable_group_attrablesr  r@  rb  r  r  rd  rc  r   r   r   r   objectr8   rv  rT   rV   rY   rZ   rb   rj   rp   ru   r   r   r   r   r  r(  r   r   r   r   r   r   r   rU  rh  re  rm  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rL   rL   rL   rM   <module>   s       (&2  D&
:ML


 W  7} eE
  2