
    Le?              
       p   d dl Z d dl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mZ 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 d d	lmZ 	 d d
lmZ m!Z" n# e#$ r d dlm Z m"Z" Y nw xY w	 d dl$m%Z%m&Z& dZ'n# e#$ r d dl(m)Z) e)Z&dZ'Y nw xY wddl*m+Z+m,Z,m-Z- ddl.m/Z/m0Z0m1Z1 ddl2m3Z3m4Z4  eej5                  Z6d Z7d e e7eeee"d d d	Z8d Z9d Z:d.dZ;d/dZ<d Z=d Z>d  Z?d.d!Z@d" ZAd# ZB	 	 d0d%ZCd1d&ZDd' ZEd( ZFd) ZG G d* d+e&          ZH G d, d-e          ZIe,D ]ZJ eH            e	jK        eJ<   dS )2    N)tickerunits)	Normalizecnames)Line2D)MarkerStyle)Path	PathPatch)validate_fontsizevalidate_fonttypevalidate_hatch)Affine2DBboxTransformedBbox)Version)CapStyle	JoinStyle)validate_capstylevalidate_joinstyle)CalendarDateTimeNetCDFTimeConverterT)DateConverterF   )arraylike_typescftime_types	is_number)RGBPolygonsRaster   )COLOR_ALIASESRGB_HEX_REGEXc                     t          | t                    sdS t          j        |           rdS | t          v rdS | t
          v rdS dS )z:
    Checks if supplied object is a valid color spec.
    FT)
isinstancestrr"   matchr!   r   )colors    ;lib/python3.11/site-packages/holoviews/plotting/mpl/util.pyis_colorr)   *   sV     eS!! u		U	#	# t	-		t	&t5    c                 @    t          |           od| cxk    odk    nc S Nr      r   xs    r(   <lambda>r1   9   s%    y||5a1 r*   c                     | t           j        v pZt          | t          t          f          p>t          | t
                    o)|                     d          o|                     d          S )N$)r   markersr$   r   r	   r%   
startswithendswithr/   s    r(   r1   r1   @   s\    	V^ 	Ja+t,--	Jq#H1<<#4#4HC r*   c                 ,    t          |           o| dk    S Nr   r.   r/   s    r(   r1   r1   E   s    9Q<<,Q!V r*   )	alphacapstyler'   fontsizefonttypehatch	joinstylemarkersc                  d    g dfdt           j                                        D             } | S )N)ztext.latex.unicodezexamples.directoryzsavefig.frameonzverbose.levelzverbose.fileodatapathztext.latex.previewzanimation.avconv_argszanimation.avconv_pathzanimation.html_argszkeymap.all_axeszsavefig.jpeg_qualityc                 T    i | ]$\  }}t           t          d           k     s|v!||%S )z3.0)mpl_versionr   ).0kvdeprecated_rcparamss      r(   
<dictcomp>z$get_old_rcparams.<locals>.<dictcomp>W   sE       A''14G+G+G 	
1+G+G+Gr*   )mplrcParamsitems)old_rcparamsrH   s    @r(   get_old_rcparamsrN   H   sS         ++--  L r*   c                     t                                           D ]7\  }}|                     |          rt          |           dk    s| |k    r|c S 8d S )Nr-   )
validatorsrL   r6   len)stylerF   rG   s      r(   get_validatorrS   ^   s_      ""  1>>! 	#e**//UaZZHHH r*   c                     t          |           dS t          |t          t          fz             r|rt	          fd|D                       S 	  |          }|dk    rdndS # t
          $ r Y dS w xY w)a  
    Validates a style and associated value.

    Arguments
    ---------
    style: str
       The style to validate (e.g. 'color', 'size' or 'marker')
    value:
       The style value to validate
    vectorized: bool
       Whether validator should allow vectorized setting

    Returns
    -------
    valid: boolean or None
       If validation is supported returns boolean, otherwise None
    Nc              3   .   K   | ]} |          V  d S N )rE   rG   	validators     r(   	<genexpr>zvalidate.<locals>.<genexpr>z   s+      //A99Q<<//////r*   FT)rS   r$   r   listall	Exception)rR   value
vectorizedvalidrX   s       @r(   validater`   d   s    $ e$$It%$011 0j 0//////////	%  uuD0   uus   A& &
A43A4c                 b   |g }|dz   }i }|                                  D ]?\  }t          fd|D                       s                    |          s|v r:||<   @|                                  D ]9\  }                    |          r|v r||t          |          d         <   :|S )a  
    Filters styles which are specific to a particular artist, e.g.
    for a GraphPlot this will filter options specific to the nodes and
    edges.

    Arguments
    ---------
    style: dict
        Dictionary of styles and values
    group: str
        Group within the styles to filter for
    other_groups: list
        Other groups to filter out
    blacklist: list (optional)
        List of options to filter out

    Returns
    -------
    filtered: dict
        Filtered dictionary of styles
    N_c              3   B   K   | ]}                     |          V  d S rV   )r5   )rE   prF   s     r(   rY   z filter_styles.<locals>.<genexpr>   s-      66AQ666666r*   )rL   anyr5   rQ   )rR   groupother_groups	blacklistfilteredrG   rF   s         @r(   filter_stylesrj      s    , 	#IEH  1666666666 	||E""	&'9nn % %1||E"" 	a9nn#$3u::;;  Or*   c                     t           t          j                  r S t                     rRd t	          j                   j        D             } }t          |          dk    rd fd	}t          j        |          S t           t                    r=t          j        d           rt          j                   S t          j                   S dS )z[
    Wraps formatting function or string in
    appropriate matplotlib formatter type.
    c                     g | ]
}|d k    |S )selfrW   )rE   args     r(   
<listcomp>z"wrap_formatter.<locals>.<listcomp>   s(     " " "&==  ==r*   r-   Nc                      |           S rV   rW   )valpos	formatters     r(   wrappedzwrap_formatter.<locals>.wrapped   s     y~~%r*   z	\{(\w+)\}rV   )r$   r   	FormattercallableinspectgetfullargspecargsrQ   FuncFormatterr%   refindallStrMethodFormatterFormatStrFormatter)rs   ry   rt   s   `  r(   wrap_formatterr      s    
 )V-.. 8	)		 8" "w5i@@E " " "t99>>& & & & & &#G,,,	Is	#	# 8:lI.. 	8,Y777,Y777	8 8r*   c                    i }d}t          |                                           D ]\  }\  }}d t          |          D             }|D ]V}t          |          }t          |          D ]5}	||	                             |	|k     r||	         nt
          j                   6Wt          |          D ]\  }	}||||	z   |z   <   ||dz
  z  }|S )Nr   c                     g | ]}g S rW   rW   )rE   rb   s     r(   ro   z#unpack_adjoints.<locals>.<listcomp>   s    +++1B+++r*   r-   )sortedrL   rangerQ   appendnpnan	enumerate)
ratios
new_ratiosoffsetrF   numratio_valuesunpackedrnris
             r(   unpack_adjointsr      s    JF"("8"8  C++c

+++ 	? 	?AQB3ZZ ? ?""1r661Q44rv>>>>?h'' 	' 	'DAq%&Jqs6z""#a%r*   c                     i }t          t          |                                            D ]@\  }}t          j        |          }|t          t          j        |                    z  ||<   A|S rV   )r   zipvaluesr   arrayfloatnanmax)r   
normalizedr   rG   arrs        r(   normalize_ratiosr      sb    J#v}}/00 2 21hqkkE")C..111
1r*   c                 l   t          |           }t          j                    5  t          j        dd           |rt	          |          }t          |                                          }t          j        t          j	        d |D                       d          cd d d            S # 1 swxY w Y   d S )Nignorez All-NaN (slice|axis) encounteredc                     g | ]\  }}|S rW   rW   )rE   rb   rG   s      r(   ro   z"compute_ratios.<locals>.<listcomp>   s    #@#@#@$!QA#@#@#@r*   r   axis)
r   warningscatch_warningsfilterwarningsr   r   rL   r   r   vstack)r   r   r   sorted_ratioss       r(   compute_ratiosr      s   v&&H		 	"	" K K*MNNN 	2'11Hx~~//00y#@#@-#@#@#@AAJJJK K K K K K K K K K K K K K K K K Ks   A9B))B-0B-c                     |                                  j        \  }}|                                 j        \  }}||k    o||k     S )z3
    Tests whether two axes overlap vertically
    )get_position	intervaly)ax1ax2b1t1b2t2s         r(   axis_overlapr      sG     )FB)FB7rBwr*   c                     g }| D ]D}d}|D ]&t          fd|D                       r	|z  d} n'|s|                    |           E| |k    r| S t          |          S )zw
    Recursively iterate over lists of axes merging
    them by their vertical overlap leaving a list
    of rows.
    Fc              3   B   K   | ]}D ]}t          ||          V  d S rV   )r   )rE   r   r   mrows      r(   rY   zresolve_rows.<locals>.<genexpr>   sU       $ $c"$ $  S)) $ $ $ $ $ $ $r*   T)re   r   resolve_rows)rowsmerged_rowsrowoverlapr   s       @r(   r   r      s     K 	$ 	$ 	 	D $ $ $ $S $ $ $ $ $ 	
  	$s###{K(((r*   皙?c                    |g }| j                                          |                                 \  }}t          d | j        D                       }	t          |	          t          d |	D                       }}
d t          |          D             }d t          |
          D             }t          |	          D ]\  }}t          |          D ]q\  }}|	                    | j         
                                          }||                             |j                   ||                             |j                   rt          d |D                       ||z  | j        z  z   }t          d |D                       ||z  | j        z  z   }||z  }d}r5                                r!                                j        | j        z  }|                     |||z  |z              | j                                          rr                                r`fd	|D             }t%          | |          }|j        d
         }r5                                r#                    |||z  z             dS dS dS dS dS )zi
    Calculate heights and widths of axes and adjust
    the size of the figure to match the aspect.
    Nc                     g | ]}|gS rW   rW   )rE   axs     r(   ro   zfix_aspect.<locals>.<listcomp>  s    111""111r*   c                 ,    g | ]}t          |          S rW   )rQ   rE   r   s     r(   ro   zfix_aspect.<locals>.<listcomp>	  s    222SVV222r*   c                     g | ]}g S rW   rW   rE   r   s     r(   ro   zfix_aspect.<locals>.<listcomp>
  s    %%%ar%%%r*   c                     g | ]}g S rW   rW   r   s     r(   ro   zfix_aspect.<locals>.<listcomp>  s    $$$Qb$$$r*   c                 ,    g | ]}t          |          S rW   sum)rE   cs     r(   ro   zfix_aspect.<locals>.<listcomp>  s    +++a3q66+++r*   c                 ,    g | ]}t          |          S rW   r   r   s     r(   ro   zfix_aspect.<locals>.<listcomp>  s    )))Q#a&&)))r*   r   c                     g | ]}|u|	S rW   rW   )rE   atitles     r(   ro   zfix_aspect.<locals>.<listcomp>  s)     , , ,qUNN *NNr*   r-   )canvasdrawget_size_inchesr   axesrQ   maxr   r   get_tightbboxget_rendererr   heightwidthdpiget_textget_window_extentset_size_inchesget_tight_bboxr   set_y)fignrowsncolsr   extra_artistsvspacehspacewhr   rscsheightswidthsr   r   r   r   bboxr   r   aspectr   tops      `                    r(   
fix_aspectr      s    JOO  DAq 1111122DYY22T22233B%%599%%%G$$%))$$$FD// ) )3s^^ 	) 	)EAr##CJ$;$;$=$=>>DAJdk***1ITZ((((	) ++7+++,,fSW0DDF))&)))**eFl37.BBE E\FF :!! :((**1#'9AfHf,--- JOO (!! (, , , ,M , , ,c=11nQ 	(U^^%% 	(KKQvX'''''( ( ( (
	( 	( 	( 	(r*   c                    |g }| j                                         }|                     |          }|dd         }||                                 z  }g }|D ]}|                    |          }t          |t                    r.|                                r~|                                }	|	t          j
        ||	          }|                                }
|
=|;|
                                }
t          j
        ||
                                          }|Q|j        dk    s|j        dk    r;t!          j        |                                          r|                    |           |rct          j        |          }t+                                          d| j        z            }t1          ||          }t          j        ||g          }|r|                    |          n|S )zL
    Compute a tight bounding box around all the artists in the figure.
    Nr   g      ?)r   r   r   get_default_bbox_extra_artistsr   r$   tupleget_clip_onget_clip_boxr   intersectionget_clip_pathget_fully_transformed_pathget_extentsr   r   r   isfiniter[   r   unionr   scaler   r   padded)r   bbox_extra_artistspadrendererbbox_inchesbbox_artistsbbox_filteredr   r   clip_box	clip_path_bboxtrans
bbox_extras                 r(   r   r   &  s    !z&&((H##H--K%aaa(LC66888LM ' '""8,,dE"" 	==?? 	B~~''H#(x88))I$)9%@@BB	()2)>)>)@)@B B Z1__q 0 0K!!## !1   &&& <
=))

  sw//$UE22
j+z!:;;&):;c"""{:r*   c                    t          | t                    r-| j        t          j        fdj        D                       }nI|                     dd          }t          |           t          u r|j	        }nt          j
        |          }|S )z=
    Return the array data from any Raster or Image type
    c                 b    g | ]+}t          j                            |d                     ,S )Fflat)r   flipuddimension_values)rE   drgbs     r(   ro   z$get_raster_array.<locals>.<listcomp>R  sF     . . . )C$8$8$8$G$GHH . . .r*   r    Fr  )r$   r   r  r   dstackvdimsr  typer   Tr  )imagedatar  s     @r(   get_raster_arrayr  L  s     % 	#iy . . . .#&9. . . / / %%ae%44;;&  6DD9T??DKr*   c                     t          |           }t          j        |t          j                  t          j        z  }t          j        |d<   t          j        |d<   |S )zc
    Produces matplotlib Path codes for exterior and interior rings
    of a polygon geometry.
    )dtyper   )rQ   r   onesr	   	code_typeLINETOMOVETO	CLOSEPOLY)r   ncodess      r(   ring_codingr  ]  sG     	E

AGAT^,,,t{:E{E!HE"ILr*   c           
      
   |                      d| j                  }t          | t                    o| j                            |           }|r| j                            |           nd}g }t          |          D ]\  }}t          j	        t          j
        |ddddf                             d                                        d                    d         }t          |          rt          j         ||dz             n|g}g }	t          |          D ]O\  }
}|
t          |          dz
  k    r
|dd	         }|d         |d	         k                                    rt          j        ||dd         d          }g }|r||         |
         ng D ]Z}|d         |d	         k                                    rt          j        ||dd         d          }|                    |           [t          j        |g|z             }t          j        t#          |          gd
 |D             z             }|	                    t%          t'          ||                               Q|                    |	           |S )z
    Converts Polygons into list of lists of matplotlib.patches.PathPatch
    objects including any specified holes. Each list represents one
    (multi-)polygon.
    r   )datatype
dimensionsNr    r   r-   r   r   r  c                 ,    g | ]}t          |          S rW   )r  )rE   r   s     r(   ro   z,polygons_to_path_patches.<locals>.<listcomp>  s    #F#F#FqKNN#F#F#Fr*   )splitkdimsr$   r   	interface	has_holesholesr   r   whereisnanastyper   rQ   re   r   concatenater  r
   r	   )elementpathsr!  r"  	mpl_pathsr   pathsplitsarrayssubpathjr   	interiorsinteriorverticesr  s                   r(   polygons_to_path_patchesr2  k  s    MM7w}MEEE7H--V'2C2M2Mg2V2VI09CG##G,,,tEIU## " "4"(42A2;#5#5g#>#>??CCCKKLLQO-0[[D$q)))tf!&)) 	= 	=HAuS[[]##crc
aE"I%**,, <	%rr;;;I,5=U1Xa[[2 + +QK8B</4466 I!y8BQB<aHHHH  ****~ugi&788HNK$6$6#7#F#FI#F#F#F$G H HENN9T(E%:%:;;<<<<!!!!r*   c                   2     e Zd ZdZe fd            Z xZS )CFTimeConverterzI
    Defines conversions for cftime types by extending nc_time_axis.
    c                 F   t           st          d          t          |t                    rt	          |j        |j                  }n8t          |t          j                  rt          j	        d |D                       }t                                          |||          S )NzIn order to display cftime types with matplotlib install the nc_time_axis library using pip or from conda-forge using:
	conda install -c conda-forge nc_time_axisc                 B    g | ]}t          |j        |j                  S rW   )r   datetimecalendar)rE   rG   s     r(   ro   z+CFTimeConverter.convert.<locals>.<listcomp>  s'    VVV1.qz1:FFVVVr*   )nc_axis_available
ValueErrorr$   r   r   r7  r8  r   ndarrayr   superconvert)clsr]   unitr   	__class__s       r(   r=  zCFTimeConverter.convert  s      	- , - - -
 e\** 	X$U^U^DDEErz** 	XHVVPUVVVWWEwwudD111r*   )__name__
__module____qualname____doc__classmethodr=  __classcell__r@  s   @r(   r4  r4    sN          2 2 2 2 [2 2 2 2 2r*   r4  c                   <     e Zd Zd fd	ZddZddZd	 Zd
 Z xZS )EqHistNormalizeNFT      c                     t                                          |||           || _        d | _        || _        t          j        dd|dz             | _        || _        d S r,   )	r<  __init___nbins
_bin_edges_ncolorsr   linspace_color_bins_rescale)rm   vminvmaxcliprescale_discrete_levelsnbinsncolorsr@  s          r(   rM  zEqHistNormalize.__init__  sY    tT***;q!WQY77/r*   c                    | j         |                                n| j         }| j        |                                n| j        }| j        }t          j        |||dz             }t          j        ||          \  }}t          j        |          d         }	t          |	          }
|
dk    rht          j
        |
dz             }||	         |dd <   t          j        dg||	         ||	dz            z   dz  g          }d|d         z  |d         z
  |d<   n|}t          j        |ddgd	          }t          j        |          }|d         }|d         |z
  }t          j        d
d
          5  ||z
  |z  }d d d            n# 1 swxY w Y   d|d<   d}| j        r|
}d}dd|z  z
  }||z  |z   }|dk    rd|z
  }t          j        |d|dz             }t          j        |||          }| j        s||d<   ||d<   |S )Nr-   r   g        g       @r    r  g      ?r_   )moder   )divideinvalidg      g9/tg      ?)rT  minrU  r   rN  r   rQ  	histogramnonzerorQ   zerosr&  convolvecumsumerrstaterS  interp)rm   r  r  lowhighrX  eq_bin_edges	full_histrb   r`  nhisthisteq_bin_centerscdflodiff
lower_spandiscrete_levelsmr   multiplecdf_binsbinnings                          r(   ru  zEqHistNormalize.binning  sb    I-dhhjjj49!Y.txxzzzDI{3eAg66|D,77	1 *Y''*G1998E!G$$D )DH^bTL4ILY`abYbLc4cgi3i,jkkN !."3 3nR6H HN1D[SzPPPN iooV2w|[(;;; 	$ 	$8t#C	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$A
= 	*#OAac	A(1,H1\
;z1ac22)Hc>::} 	GAJs   ,	FFFc                 8    |                      |          d         S r8   )process_value)rm   r  rV  s      r(   __call__zEqHistNormalize.__call__  s    !!$''**r*   c                 R   t          |t          j                  r |                     || j                  | _        t          j        |          }|rt          j        |g          n|}t          j        || j        | j	                  }t          j
                            |          |fS rV   )r$   r   r;  ru  rP  rO  isscalarr   re  rR  ma)rm   r  rz  interpeds       r(   rw  zEqHistNormalize.process_value  s    dBJ'' 	@"ll4??DO;t$$#+5rx9T4?D4DEEu{{8$$h..r*   c                 |    | j         t          d          t          j        |g| j        | j                   d         S )Nz.Not invertible until eq_hist has been computedr   )rO  r:  r   re  rR  )rm   r]   s     r(   inversezEqHistNormalize.inverse  s9    ?"MNNNy%$"2DODDQGGr*   )NNFTrJ  rK  )rK  rV   )	rA  rB  rC  rM  ru  rx  rw  r~  rF  rG  s   @r(   rI  rI    s        0 0 0 0 0 0) ) ) )V+ + + +/ / /H H H H H H Hr*   rI  )TrV   )NNr   r   )NN)Lrw   r{   r   
matplotlibrJ   numpyr   r   r   munitsmatplotlib.colorsr   r   matplotlib.linesr   matplotlib.markersr   matplotlib.patchesr	   r
   matplotlib.rcsetupr   r   r   matplotlib.transformsr   r   r   packaging.versionr   matplotlib._enumsr   r   r   r   ImportErrornc_time_axisr   r   r9  matplotlib.datesr   	core.utilr   r   r   r'  r   r   r   utilr!   r"   __version__rD   r)   rP   rN   rS   r`   rj   r   r   r   r   r   r   r   r   r  r  r2  r4  rI  cftregistryrW   r*   r(   <module>r     s-    				                 0 / / / / / / / # # # # # # * * * * * * . . . . . . . . S S S S S S S S S S A A A A A A A A A A % % % % % %I          I I IHHHHHHHHHHIBBBBBBBB   ......'
 B A A A A A A A A A , , , , , , , , , , / / / / / / / /gco&&   65!!!# 
 
-	, 
   ,     <# # # #L8 8 8*    K K K K  ) ) ). =A"%'( '( '( '(T#; #; #; #;L  "    @2 2 2 2 2) 2 2 2(CH CH CH CH CHi CH CH CHL  - -C*?,,FOC- -s$   A A-,A-1
A< <BB