+L i`dZddlZddlmZddlmZddlmZddZ e e_ GddeZ y) z Renderer Module This module defines the PlotlyRenderer class and a single function, fig_to_plotly, which is intended to be the main way that user's will interact with the matplotlylib package. N)Renderer)mpltoolsc2|d|d|jd|dS)N:z: z: z )__name__)msgcategoryfilenamelinenofilelines b/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/plotly/matplotlylib/renderer.pywarning_on_one_liners%-vx7H7H# NNceZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZdZdZy)PlotlyRenderera A renderer class inheriting from base for rendering mpl plots in plotly. A renderer class to be used with an exporter for rendering matplotlib plots in Plotly. This module defines the PlotlyRenderer class which handles the creation of the JSON structures that get sent to plotly. All class attributes available are defined in __init__(). Basic Usage: # (mpl code) # fig = gcf() renderer = PlotlyRenderer(fig) exporter = Exporter(renderer) exporter.run(fig) # ... et voila ctj|_d|_d|_d|_g|_d|_d|_d|_ d|_ d|_ d|_ d|_ y)zInitialize PlotlyRenderer obj. PlotlyRenderer obj is called on by an Exporter object to draw matplotlib objects like figures, axes, text, etc. All class attributes are listed here in the __init__ method. NrF)rzInitialized PlotlyRenderer )goFigure plotly_figmpl_figcurrent_mpl_axbar_containers current_barsaxis_ct x_is_mpl_date mpl_x_bounds mpl_y_boundsr_processing_legend_legend_visibleselfs r__init__zPlotlyRenderer.__init__,sf))+ "" """1"'$rc |xjdz c_||_tjt |d|dzt |d|dzdd|j d<t j|\|_|_ tjjt |jd |j dd zt d |jd z |j dd zt d |jd z |j dd zt |jd |j dd zd }||j dd<y)aCreates a new figure by beginning to fill out layout dict. The 'autosize' key is set to false so that the figure will mirror sizes set by mpl. The 'hovermode' key controls what shows up when you mouse around a figure in plotly, it's set to show the 'closest' point. Positional agurments: fig -- a matplotlib.figure.Figure object. props.keys(): [ 'figwidth', 'figheight', 'dpi' ] zOpening figure figwidthdpi figheightFclosest)widthheightautosize hovermodelayoutrr*rr+)lrtbpadmarginN) rrrLayoutintrrget_axes_boundsrrr.Margin)r#figpropsr4s r open_figurezPlotlyRenderer.open_figureBsS && $&IIeJ'%,67u[)E%L89 % ! 08/G/G/L,4,!!$##A&)B7)KKL1t((++tx/H/QQR1t((++tx/H/RRS$##A&)B8)LLM " /5!(+rc.|xjdz c_y)a Closes figure by cleaning up data and layout dictionaries. The PlotlyRenderer's job is to create an appropriate set of data and layout dictionaries. When the figure is closed, some cleanup and repair is necessary. This method removes inappropriate dictionary entries, freeing up Plotly to use defaults and best judgements to complete the entries. This method is called by an Exporter object. Positional arguments: fig -- a matplotlib.figure.Figure object. zClosing figure Nr)r#r9s r close_figurezPlotlyRenderer.close_figureds &&rc|xjdz c_||_|jDcgc]}|jjdk(r|c}|_g|_|xjdz c_tjjdj|jdd}tjjdj|jdd}tj|||j|j \}}|j#||j#|tj$|d }tj$|d } tj$|d } tj$|d } tj&|| |d<tj&| | |d<||d<| |d<||j(ddj|j<||j(ddj|j<dt+|vr|ddk(rd|_yyycc}w)a;Setup a new axes object (subplot in plotly). Plotly stores information about subplots in different 'xaxis' and 'yaxis' objects which are numbered. These are just dictionaries included in the layout dictionary. This function takes information from the Exporter, fills in appropriate dictionary entries, and updates the layout dictionary. PlotlyRenderer keeps track of the number of plots by incrementing the axis_ct attribute. Setting the proper plot domain in plotly is a bit tricky. Refer to the documentation for mpltools.convert_x_domain and mpltools.convert_y_domain. Positional arguments: ax -- an mpl axes object. This will become a subplot in plotly. props.keys() -- [ 'axesbg', (background color for axes obj) 'axesbgalpha', (alpha, or opacity for background) 'bounds', ((x0, y0, width, height) for axes) 'dynamic', (zoom/pan-able?) 'axes', (list: [xaxis, yaxis]) 'xscale', (log, linear, or date) 'yscale', 'xlim', (range limits for x) 'ylim', 'xdomain' (xdomain=xlim, unless it's a date) 'ydomain' ] z Opening axes BarContainerry{0}Finside)anchorzerolineticksx{0})axr:x_boundsy_boundsbottomtopleftrightmirrorshowliner.xaxis{0}yaxis{0}typedateTN)rr containers __class__rrrrrr.XAxisformatYAxisr prep_xy_axisrrupdateget_spine_visibleget_axis_mirrorrdirr) r#rGr:cxaxisyaxis mpl_xaxis mpl_yaxis bottom_spine top_spine left_spine right_spines r open_axeszPlotlyRenderer.open_axesss> && ]] {{##~5      ==.h   ==.h   (44):):TEVEV  9  Y Y11"h? ..r59 //F; 00W= "22<Kh"22:{Kh(j%jFK!*"3"3DLL"ABEJ!*"3"3DLL"AB SZ E&MV$;!%D %< G s"Icr|j|j|xjdz c_d|_y)aClose the axes object and clean up. Bars from bar charts are given to PlotlyRenderer one-by-one, thus they need to be taken care of at the close of each axes object. The self.current_bars variable should be empty unless a bar chart has been created. Positional arguments: ax -- an mpl axes object, not required at this time. z Closing axes FN) draw_barsrrr)r#rGs r close_axeszPlotlyRenderer.close_axess- t(() &&"rc|xjdz c_d|_|jdd|_|jr(|xjdz c_d|jdd<y|xjdz c_y) a\Enable Plotly's native legend when matplotlib legend is detected. This method is called when a matplotlib legend is found. It enables Plotly's showlegend only if the matplotlib legend is visible. Positional arguments: legend -- matplotlib.legend.Legend object props -- legend properties dictionary z Opening legend TvisiblezA Enabling native plotly legend (matplotlib legend is visible) r. showlegendz; Not enabling legend (matplotlib legend is not visible) N)rr getr!r)r#legendr:s r open_legendzPlotlyRenderer.open_legendsl (("&$yyD9    HHT H7;DOOH %l 3 HHV VHrcJ|xjdz c_d|_d|_y)zuFinalize legend processing. Positional arguments: legend -- matplotlib.legend.Legend object z Closing legend FN)rr r!)r#ros r close_legendzPlotlyRenderer.close_legends# (("'$rcg}|jD]2}|j|jDcgc] }|d|vr| c}4|D]}|j|ycc}w)Nmplobj)rappendrdraw_bar)r#bars mpl_traces container bar_propstraces rrizPlotlyRenderer.draw_barssw ,, I   &*%6%6! *i7    !E MM%  ! sA c d}|Dcgc]}tjd$i|}}|Dcgc] }|d|dz c}|Dcgc] }|d|dz c}ttfdt t D|k}ttfdt t D|k}|rD|rB|Dcgc]}|d c}t fdt t d d Drd }n d }n|rd }nd }|d k(r||xjd z c_|Dcgc]}|d }}|D]} d| d| dz c| d<| d<|Dcgc]}|d } }t|| D];\} } t| | z |kDsd|jdd<d|jdd<=|D cgc]} | d| d| dz dz z} } |D cgc]} | d }} tj|D cgc]} | d c} |D cgc]} | d c} }|jro|D cgc]} | d } } |jjjjj }tj"| |} n |xjdz c_|Dcgc]}|d }}|D]} d| d| dz c| d<| d<|Dcgc]}|d }}t||D];\} } t| | z |kDsd|jdd<d|jdd<=|D cgc]} | d } } |D cgc]} | d| d| dz dz z}} tj|D cgc]} | d c} |D cgc]} | d c} }t%j&|| |dj)|j*dj)|j*|ddt$j,j/|ddt1|dd} t | ddkDrF|xjd z c_|jj3| |||jdd!<y y |xjd"z c_t5j6d#y cc}wcc}wcc}wcc}wcc}wcc}wcc} wcc} wcc} wcc} wcc} wcc}wcc}wcc} wcc} wcc} wcc} w)%aDraw a collection of similar patches as a bar chart. After bars are sorted, an appropriate data dictionary must be created to tell plotly about this data. Just like draw_line or draw_markers, draw_bar translates patch/path information into something plotly understands. Positional arguments: patch_coll -- a collection of patches to be drawn as a bar chart. g|=x1x0y1y0c34K|]}d|z ywrN).0iiiwidthss r z*PlotlyRenderer.draw_bar..sQs6!9vc{2Qc34K|]}d|z ywrr)rrheightss rrz*PlotlyRenderer.draw_bar.. sM#GAJ-Mrc3:K|]}|dz|kDyw)rNr)rrx_zeross rrz*PlotlyRenderer.draw_bar..s#USq!GCL0UsNvhz, Attempting to draw a vertical bar chart rstackr.barmodexr-z. Attempting to draw a horizontal bar chart yrFrAalpha facecolor edgewidth)r*)colorr ) orientationrrr_r`opacitymarkerrz% Heck yeah, I drew that bar chart bargapz Bar chart not drawn zNfound box chart data with length <= 1, assuming data redundancy, not plotting.r)rmake_barabssumrangelenallrzipr get_bar_gaprr get_xaxisget_major_formatterrUrmpl_dates_to_datestringsrBarrWrbarMarkerdict add_tracewarningswarn)r#colltolrzr{vertical horizontalr old_heightsr new_heightsoldnewrrbar_gap formatter old_rights new_rightsrrrs @@@rrvzPlotlyRenderer.draw_barsAEFI""/Y/FFEJK )D/IdO3KFKL9T?Yt_4LsQeCK>PQQRUXX Ms7|9LMM NQT T   8=>9y>GUE#gcrlBSC';BDOOH-i8=@DOOH-k: AEJJSTc$i#d)3q88JAJ&+,sT,A,**&+,sT,E.JSs4y.JG!!*/03SY00''113((*Yxx 55aC HHI IH;@Ai)D/AJA @'(#d)c$i*?$D 3t9 @;@Ai)D/AJA J7 ASsSy>C';BDOOH-i8=@DOOH-k: A',,sT,A,DIJSTc$i#d)3q88JAJ**&+,sT,E.JSs4y.JGff#-- --- -!HW%66==Ah{+a 56!   s3x=1  HH@ @H OO % %c *"6=)(3# HH3 3H MM: _GKL?CC K,,.J1BB -J,.JsdR!R&R+ R0* R5 R:3R? S5 S  S + S& S S/ S"S'1 S, S1 c |xjdz c_iii}}}|dr|dr|xjdz c_d}n9|dr|xjdz c_d}n|dr|xjdz c_d }|drtj|dd |dd }|d d k(rBtjj ||ddtj |dd}n7tt||ddtj |dd}|dr|d d k(rgtjj|dd |ddtj|dd|ddt|dd|dd}nRt|dd |ddtj|dd|ddt|dd|dd}|d d k(r0tjt|dtrt|dn|d|d Dcgc]}|d c}|d Dcgc]}|d c}dj|jdj|j||}|jrX|j j#j%j&j(} tj*|d | |d <|j,j/||xjd!z c_y&|d d"k(r|xjd#z c_y&|xjd$z c_t1j2d%y&cc}wcc}w)'aCreate a data dict for a line obj. This will draw 'lines', 'markers', or 'lines+markers'. For legend elements, this will use layout.shapes, so they can be positioned with paper refs. props.keys() -- [ 'coordinates', ('data', 'axes', 'figure', or 'display') 'data', (a list of xy pairs) 'mplobj', (the matplotlib.lines.Line2D obj being rendered) 'label', (the name of the Line2D obj being rendered) 'linestyle', (linestyle dict, can be None, see below) 'markerstyle', (markerstyle dict, can be None, see below) ] props['linestyle'].keys() -- [ 'alpha', (opacity of Line2D obj) 'color', (color of the line if it exists, not the marker) 'linewidth', 'dasharray', (code for linestyle, see DASH_MAP in mpltools.py) 'zorder', (viewing precedence when stacked with other objects) ] props['markerstyle'].keys() -- [ 'alpha', (opacity of Line2D obj) 'marker', (the mpl marker symbol, see SYMBOL_MAP in mpltools.py) 'facecolor', (color of the marker face) 'edgecolor', (color of the marker edge) 'edgewidth', (width of marker edge) 'markerpath', (an SVG path for drawing the specified marker) 'zorder', (viewing precedence when stacked with other objects) ] z Attempting to draw a line linestyle markerstylez... with both lines+markers z lines+markersz... with just lines linesz... with just markers markersrr coordinatesdata linewidth dasharray)rr*dash)r rr markersize edgecolorr)rr*)rrsymbolsizer )r fillcolorrrr labelrrrFrA)modenamerrr_r`r rrz Heck yeah, I drew that line axesz Using native legend z5 Line didn't have 'data' coordinates, not drawing zeBummer! Plotly can currently only draw Line2D objects from matplotlib that are in 'data' coordinates!N)rrmerge_color_and_opacityrscatterLine convert_dashrrconvert_symbolScatter isinstancestrrWrrrrrrUrrrrrr) r#r:r rshaperrxy_pair marked_liners rdraw_marked_linezPlotlyRenderer.draw_marked_lineXsD 44 "bef  % "6 HH7 7H"D ;  HH/ /HD = ! HH1 1HD  44k"7+U;-?-HE]#v-zz ,[9!..u[/A+/NO' ##K0=%2253Ek3RS  ]#v-**!-09 .{;#2253G3QR}-l;#M2;?#M2;? + !-09#M2;?#2253G3QR}-l;#M2;?#M2;?   6 )**"%.#6g'w-26];'71:;-26];'71:;mmDLL1mmDLL1 K!!''113((*Yxx $,#D#D$i$ C  OO % %k 2 HH; ;H = !V + HH3 3H HHP PH MM /<;s * M' ? M,c |xjdz c_|xjdz c_tjdy)z3Draw image. Not implemented yet! z Attempting to draw image z Not drawing image zoAw. Snap! You're gonna have to hold off on the selfies for now. Plotly can't import images from matplotlib yet!N)rrr)r#r:s r draw_imagezPlotlyRenderer.draw_images3 44 --  * rc "|xjdz c_|ddk(rHtj|}d|dd|dd}|xjdz c_|jd i|y|xjdz c_t j d y) arAdd a path collection to data list as a scatter plot. Current implementation defaults such collections as scatter plots. Matplotlib supports collections that have many of the same parameters in common like color, size, path, etc. However, they needn't all be the same. Plotly does not currently support such functionality and therefore, the style for the first object is taken and used to define the remaining paths in the collection. props.keys() -- [ 'paths', (structure: [vertices, path_code]) 'path_coordinates', ('data', 'axes', 'figure', or 'display') 'path_transforms', (mpl transform, including Affine2D matrix) 'offsets', (offset from axes, helpful if in 'data') 'offset_coordinates', ('data', 'axes', 'figure', or 'display') 'offset_order', 'styles', (style dict, see below) 'mplobj' (the collection obj being drawn) ] props['styles'].keys() -- [ 'linewidth', (one or more linewidths) 'facecolor', (one or more facecolors for path) 'edgecolor', (one or more edgecolors for path) 'alpha', (one or more opacites for path) 'zorder', (precedence when stacked) ] z) Attempting to draw a path collection offset_coordinatesroffsetsN)rrrrrz' Drawing path collection as markers z6 Path collection not linked to 'data', not drawing zDang! That path collection is out of this world. I totally don't know what to do with it yet! Plotly can only import path collections linked to 'data' coordinatesr)rrget_markerstyle_from_collectionrrr)r#r:r scatter_propss rdraw_path_collectionz#PlotlyRenderer.draw_path_collections< @@ % && 0"BB5IK%i(*! M HHB BH !D ! ! 2M 2 HHQ QH MM; rc |xjdz c_tj|jjfi|}|r|xj |gz c_y|xjdz c_t jdy)a[Draw path, currently only attempts to draw bar charts. This function attempts to sort a given path into a collection of horizontal or vertical bar charts. Most of the actual code takes place in functions from mpltools.py. props.keys() -- [ 'data', (a list of verticies for the path) 'coordinates', ('data', 'axes', 'figure', or 'display') 'pathcodes', (code for the path, structure: ['M', 'L', 'Z', etc.]) 'style', (style dict, see below) 'mplobj' (the mpl path object) ] props['style'].keys() -- [ 'alpha', (opacity of path obj) 'edgecolor', 'facecolor', 'edgewidth', 'dasharray', (style for path's enclosing line) 'zorder' (precedence of obj when stacked) ] z Attempting to draw a path z' This path isn't a bar, not drawing zJI found a path object that I don't think is part of a bar chart. Ignoring.N)rris_barrrTrrr)r#r:rs r draw_pathzPlotlyRenderer.draw_pathsh2 55!4!4!?!?I5I    % (  HHB BH MM, rc *|xjdz c_tj|d|jst j d|dj }|s|dd}d|jdvrg|jdd<|dd k(r(|xjd z c_|jd*i|y|dd k(r(|xjd z c_|jd*i|y|dd k(r(|xjdz c_|jd*i|y|xjdz c_|jr*|jr|ddk(r|xjdz c_y|ddk7r|xjdz c_|djj|d\}}tj|||jd\}}d}d}|dd} tj |dd} na|xjdz c_|d\}}|j"} |jddj%| } |jddj%| } | dd|cxkr | ddkrTnnQ| dd|cxkr | ddkr:nn7dj%|j"}d j%|j"}nh|xjd!z c_|djj|d\}}tj|||jd\}}d}d}|dd} tj |dd} t&j(j+t-|d"t.rt/|d"n|d"|dd#|||||| | d$t&j(j0j3|dd%|dd&'( }|jddxx|fz cc<|xjd)z c_y)+aCreate an annotation dict for a text obj. Currently, plotly uses either 'page' or 'data' to reference annotation locations. These refer to 'display' and 'data', respectively for the 'coordinates' key used in the Exporter. Appropriate measures are taken to transform text locations to reference one of these two options. props.keys() -- [ 'text', (actual content string, not the text obj) 'position', (an x, y pair, not an mpl Bbox) 'coordinates', ('data', 'axes', 'figure', 'display') 'text_type', ('title', 'xlabel', or 'ylabel') 'style', (style dict, see below) 'mplobj' (actual mpl text object) ] props['style'].keys() -- [ 'alpha', (opacity of text) 'fontsize', (size in points of text) 'color', (hex color) 'halign', (horizontal alignment, 'left', 'center', or 'right') 'valign', (vertical alignment, 'baseline', 'center', or 'top') 'rotation', 'zorder', (precedence of text when stacked with other objs) ] z* Attempting to draw an mpl text object rtaULooks like the annotation(s) you are trying to draw lies/lay outside the given figure size. Therefore, the resulting Plotly figure may not be large enough to view the full text. To adjust the size of the figure, use the 'width' and 'height' keys in the Layout object. Alternatively, use the Margin object to adjust the figure's margins.stylehalign annotationsr. text_typexlabelz Text object is an xlabel ylabelz Text object is a ylabel titlez Text object is a title z) Text object is a normal annotation rrz> Skipping legend text annotation (using native legend) Nrz7 Text object isn't linked to 'data' coordinates positionpapervalignz4 Text object is linked to 'data' coordinates rPrQrrrrFrAzL Text object is outside plotting area, making 'paper' reference. textrFrfontsizerr) rrrrxrefyrefalignxanchoryanchor showarrowfontz& Heck, yeah I drew that annotation r)rr check_cornersrrr_multialignmentr draw_xlabel draw_ylabel draw_titler r! get_transform transformdisplay_to_paper convert_varrWrr. Annotationrr annotationFont)r#r:rx_pxy_pxrrrrrrrr_r`rs r draw_textzPlotlyRenderer.draw_text9s : AA%%eHot||D MMH h//'N8,E  9 979DOOH %m 4   ) HH: :H D   %u % ; 8 + HH9 9H D   %u % ; 7 * HH8 8H DOO $e $ HHD DH''((-(F2U]#v-VV(O113==eJ>OPd 00tT__X=VW1.2"--eGnX.FGSSZ(1,,1*2C2CG2LM1*2C2CG2LM'N1%=E'N1,==gq)AAgq0AA!==6D!==6DHHEH h557AA% BSTD$$44dDOOH$=DAq#D"D.2"--eGnX.FG--"%-5f &vgw/YY))...1gz8R/.J& OOH %m 4 E 4 HHA AHrc |xjdz c_t|jjdkDr|xjdz c_|dj j |d\}}t j|||jd\}}tjj|dtjjj|dd |dd  d d ||d dd }|jddxx|fz cc<y|xjdz c_|d|jdd<t|dd |dd }||jdd<y)aAdd a title to the current subplot in layout dictionary. If there exists more than a single plot in the figure, titles revert to 'page'-referenced annotations. props.keys() -- [ 'text', (actual content string, not the text obj) 'position', (an x, y pair, not an mpl Bbox) 'coordinates', ('data', 'axes', 'figure', 'display') 'text_type', ('title', 'xlabel', or 'ylabel') 'style', (style dict, see below) 'mplobj' (actual mpl text object) ] props['style'].keys() -- [ 'alpha', (opacity of text) 'fontsize', (size in points of text) 'color', (hex color) 'halign', (horizontal alignment, 'left', 'center', or 'right') 'valign', (vertical alignment, 'baseline', 'center', or 'top') 'rotation', 'zorder', (precedence of text when stacked with other objs) ] z# Attempting to draw a title rz< More than one subplot, adding title as annotation rtrr.rrrrrrcenterrJF) rrrrrrrrrrz; Only one subplot found, adding as a plotly title rrr title_fontN)rrrrrrrrrrr.rrrr)r#r:rrrrrr s rrzPlotlyRenderer.draw_titlese4 :: t||  !A % HHW WHx668BB5CTUJD$,,T49RSDAq--6]YY))...1gz8R/  . J OOH %m 4 E 4 HHV VH16vDOOH %g .7^J/uW~g7NJ7ADOOH %l 3rc |xjdz c_dj|j}t|d|jd|d<t |dd|dd }||jd|d <y ) aeAdd an xaxis label to the current subplot in layout dictionary. props.keys() -- [ 'text', (actual content string, not the text obj) 'position', (an x, y pair, not an mpl Bbox) 'coordinates', ('data', 'axes', 'figure', 'display') 'text_type', ('title', 'xlabel', or 'ylabel') 'style', (style dict, see below) 'mplobj' (actual mpl text object) ] props['style'].keys() -- [ 'alpha', (opacity of text) 'fontsize', (size in points of text) 'color', (hex color) 'halign', (horizontal alignment, 'left', 'center', or 'right') 'valign', (vertical alignment, 'baseline', 'center', or 'top') 'rotation', 'zorder', (precedence of text when stacked with other objs) ] z Adding xlabel rPrr.rrrrr r N)rrWrrrrr#r:axis_keyr s rrzPlotlyRenderer.draw_xlabels. --$$T\\27:5=7I!(+G4w +5>'3J =G!(+L9rc |xjdz c_dj|j}|d|jd|d<t |dd|dd }||jd|d <y ) adAdd a yaxis label to the current subplot in layout dictionary. props.keys() -- [ 'text', (actual content string, not the text obj) 'position', (an x, y pair, not an mpl Bbox) 'coordinates', ('data', 'axes', 'figure', 'display') 'text_type', ('title', 'xlabel', or 'ylabel') 'style', (style dict, see below) 'mplobj' (actual mpl text object) ] props['style'].keys() -- [ 'alpha', (opacity of text) 'fontsize', (size in points of text) 'color', (hex color) 'halign', (horizontal alignment, 'left', 'center', or 'right') 'valign', (vertical alignment, 'baseline', 'center', or 'top') 'rotation', 'zorder', (precedence of text when stacked with other objs) ] z Adding ylabel rQrr.rrrrr r N)rrWrrrrs rrzPlotlyRenderer.draw_ylabel s. --$$T\\27'3J =G!(+L9rc|xjdz c_dD]} |jd|=y#ttf$rY(wxYw)aIRevert figure layout to allow plotly to resize. By default, PlotlyRenderer tries its hardest to precisely mimic an mpl figure. However, plotly is pretty good with aesthetics. By running PlotlyRenderer.resize(), layout parameters are deleted. This lets plotly choose them instead of mpl. z+Resizing figure, deleting keys from layout )r*r+r,r4r.N)rrKeyErrorAttributeError)r#keys rresizezPlotlyRenderer.resize)sQ BB< C OOH-c2 n-  s/AAc.|xjdz c_y)Nz+Stripping mpl style is no longer supported r=r"s r strip_stylezPlotlyRenderer.strip_style9s BBrN)r __module__ __qualname____doc__r$r;r>rgrjrprrrirvrrrrrrrrrrrrrrrsx$%, 5D 'E&N# W*% !_Bzx  1f"H{Bz3AjG>G> Crr)NN) rrplotly.graph_objs graph_objsrplotly.matplotlylib.mplexporterrplotly.matplotlylibrr formatwarningrrrrr s84(O-a CXa Cr