From 8395eb71f193ddad1b0e8d74540ef48af0c7f6a6 Mon Sep 17 00:00:00 2001 From: Holger Frey Date: Wed, 5 May 2021 15:54:55 +0200 Subject: [PATCH] first working version --- README.md | 36 ++- compile.py | 67 ++++++ cpi.mplstyle | 542 ++++++++++++++++++++++++++++++++++++++++++ custom cpi styles.txt | 34 +++ default.mplstyle | 485 +++++++++++++++++++++++++++++++++++++ test_data.pkl | Bin 0 -> 48272 bytes 6 files changed, 1163 insertions(+), 1 deletion(-) create mode 100644 compile.py create mode 100644 cpi.mplstyle create mode 100644 custom cpi styles.txt create mode 100644 default.mplstyle create mode 100644 test_data.pkl diff --git a/README.md b/README.md index 8d1eb19..926893b 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,36 @@ -# cpi-matplotlib-styles +# CPI matplotlib plotting style +This library provides a custom plotting style for [matplotlib][mpl] and +other libraries building on matplotlib like [pandas][pd] or [seaborn][sns]. + +The plotting style is set to aproximately the styles described in +[our wiki], more precicely in this [PowerPoint presentation][ppt]. + + +## how to use it + +copy the file `cpi.mplstyle` into the directory with your analysis and tell +matplotlib to use this style: + +usage with matplotlib / pyplot: +> from matplotlib import pyplot +> pyplot.style.use('./cpi.mplstyle') +usage with other libraries based on matplotlib, like searborn: +> from matplotlib import pyplot +> import seaborn +> pyplot.style.use('./cpi.mplstyle') + +be aware that the set* functions of seaborn (like set_theme) might +mess with the matplotlib style. + +to use the seaborn.set_palette() function to change line colors seems +to be fine +to use this style as your default matplotlib style, have a look at +https://matplotlib.org/stable/tutorials/introductory/customizing.html#customizing-with-matplotlibrc-files + + +[mpl]: https://matplotlib.org/ +[pd]: https://pandas.pydata.org/ +[sns]: https://seaborn.pydata.org/ +[wiki]: https://wiki.cpi.imtek.uni-freiburg.de/ScientificWriting +[ppt]: https://wiki.cpi.imtek.uni-freiburg.de/ScientificWriting?action=AttachFile&do=view&target=140109-scientific-writing-06-figures-and-figure-captions.pptx \ No newline at end of file diff --git a/compile.py b/compile.py new file mode 100644 index 0000000..3748a93 --- /dev/null +++ b/compile.py @@ -0,0 +1,67 @@ +from pathlib import Path + +file_custom_edits = Path("./custom cpi styles.txt") +file_defaults = Path("./default.mplstyle") +file_cpi_style = Path("./cpi.mplstyle") + +cpi_style_header = """ +### CPI matplotlib plotting style + +# the plotting styles are set to aproximately the styles described in +# https://wiki.cpi.imtek.uni-freiburg.de/ScientificWriting +# in the file `140109-scientific-writing-06-figures-and-figure-captions.pptx` + +# usage with matplotlib / pyplot: +# > from matplotlib import pyplot +# > pyplot.style.use('./cpi.mplstyle') + +# usage with other libraries based on matplotlib, like searborn: +# > from matplotlib import pyplot +# > import seaborn +# > pyplot.style.use('./cpi.mplstyle') +# +# be aware that the set* functions of seaborn (like set_theme) might +# mess with the matplotlib style. +# +# to use the seaborn.set_palette() function to change line colors seems +# to be fine + +# to use this style as your default matplotlib style, have a look at +# https://matplotlib.org/stable/tutorials/introductory/customizing.html#customizing-with-matplotlibrc-files + +""" + + +def get_custom_edits(filepath=file_custom_edits): + with filepath.open("r") as fh: + lines = (line.strip() for line in fh) + not_empty = (line for line in lines if line) + with_data = (line for line in not_empty if ":" in line) + raw_data = (line.split(":", 1) for line in with_data) + data = ((k.strip(), v.strip()) for k, v in raw_data) + return dict(sorted(data)) + +custom_edits = get_custom_edits(file_custom_edits) +key_max_length = 1 + max(len(k) for k in custom_edits) + + +with open(file_cpi_style, "w") as fw: + fw.write(cpi_style_header) + + for key, value in custom_edits.items(): + line = f"{key:<{key_max_length}}: {value}" + fw.write(f"{line}\n") + + fw.write(f"\n\n\n") + fw.write(f"### Following are the default matplotlib settings\n") + fw.write(f"### Custom styles are commented out\n\n") + + with open(file_defaults, "r") as fr: + for line in fr: + try: + key = line.split(":")[0] + if key.strip() in custom_edits: + line = f"#{line}" + except ValueError(): + pass + fw.write(line) \ No newline at end of file diff --git a/cpi.mplstyle b/cpi.mplstyle new file mode 100644 index 0000000..f984267 --- /dev/null +++ b/cpi.mplstyle @@ -0,0 +1,542 @@ + +### CPI matplotlib plotting style + +# the plotting styles are set to aproximately the styles described in +# https://wiki.cpi.imtek.uni-freiburg.de/ScientificWriting +# in the file `140109-scientific-writing-06-figures-and-figure-captions.pptx` + +# usage with matplotlib / pyplot: +# > from matplotlib import pyplot +# > pyplot.style.use('./cpi.mplstyle') + +# usage with other libraries based on matplotlib, like searborn: +# > from matplotlib import pyplot +# > import seaborn +# > pyplot.style.use('./cpi.mplstyle') +# +# be aware that the set* functions of seaborn (like set_theme) might +# mess with the matplotlib style. +# +# to use the seaborn.set_palette() function to change line colors seems +# to be fine + +# to use this style as your default matplotlib style, have a look at +# https://matplotlib.org/stable/tutorials/introductory/customizing.html#customizing-with-matplotlibrc-files + +axes.labelsize : 14 # fontsize of the x any y labels +axes.prop_cycle : cycler('color', ['1f77b4', 'ff7f0e', '2ca02c', 'd62728', '9467bd', '8c564b', 'e377c2', '7f7f7f', 'bcbd22', '17becf']) +figure.dpi : 200 # figure dots per inch +figure.facecolor : w # figure facecolor +figure.figsize : 7, 4 # figure size in inches +figure.titlesize : 18 # size of the figure title +image.cmap : Paired # gray jet etc... +legend.fancybox : False # if True, use a rounded box for the +legend.fontsize : 14 # fontsize of the legend labels +legend.frameon : False # whether or not to draw a frame around legend +lines.linewidth : 2.0 # line width in points +savefig.dpi : 200 # figure dots per inch +xtick.bottom : True # draw ticks on the bottom side +xtick.direction : in # direction: in, out, or inout +xtick.labelsize : 14 # fontsize of the tick labels +xtick.major.width : 1 # major tick width in points +xtick.minor.width : 1 # minor tick width in points +xtick.top : True # draw ticks on the top side +ytick.direction : in # direction: in, out, or inout +ytick.labelleft : True # show tick labels on the left side +ytick.labelright : False # show tick labels on the right side +ytick.labelsize : 14 # fontsize of the tick labels +ytick.left : True # draw ticks on the left side +ytick.major.width : 1 # major tick width in points +ytick.minor.width : 1 # minor tick width in points +ytick.right : True # draw ticks on the right side + + + +### Following are the default matplotlib settings +### Custom styles are commented out + +### Classic matplotlib plotting style as of v1.5 + + +### LINES +# See http://matplotlib.org/api/artist_api.html#module-matplotlib.lines for more +# information on line properties. +#lines.linewidth : 1.0 # line width in points +lines.linestyle : - # solid line +lines.color : b # has no affect on plot(); see axes.prop_cycle +lines.marker : None # the default marker +lines.markerfacecolor : auto # the default markerfacecolor +lines.markeredgecolor : auto # the default markeredgecolor +lines.markeredgewidth : 0.5 # the line width around the marker symbol +lines.markersize : 6 # markersize, in points +lines.dash_joinstyle : round # miter|round|bevel +lines.dash_capstyle : butt # butt|round|projecting +lines.solid_joinstyle : round # miter|round|bevel +lines.solid_capstyle : projecting # butt|round|projecting +lines.antialiased : True # render lines in antialiased (no jaggies) +lines.dashed_pattern : 6, 6 +lines.dashdot_pattern : 3, 5, 1, 5 +lines.dotted_pattern : 1, 3 +lines.scale_dashes: False + +### Marker props +markers.fillstyle: full + +### PATCHES +# Patches are graphical objects that fill 2D space, like polygons or +# circles. See +# http://matplotlib.org/api/artist_api.html#module-matplotlib.patches +# information on patch properties +patch.linewidth : 1.0 # edge width in points +patch.facecolor : b +patch.force_edgecolor : True +patch.edgecolor : k +patch.antialiased : True # render patches in antialiased (no jaggies) + +hatch.color : k +hatch.linewidth : 1.0 + +hist.bins : 10 + +### FONT +# +# font properties used by text.Text. See +# http://matplotlib.org/api/font_manager_api.html for more +# information on font properties. The 6 font properties used for font +# matching are given below with their default values. +# +# The font.family property has five values: 'serif' (e.g., Times), +# 'sans-serif' (e.g., Helvetica), 'cursive' (e.g., Zapf-Chancery), +# 'fantasy' (e.g., Western), and 'monospace' (e.g., Courier). Each of +# these font families has a default list of font names in decreasing +# order of priority associated with them. When text.usetex is False, +# font.family may also be one or more concrete font names. +# +# The font.style property has three values: normal (or roman), italic +# or oblique. The oblique style will be used for italic, if it is not +# present. +# +# The font.variant property has two values: normal or small-caps. For +# TrueType fonts, which are scalable fonts, small-caps is equivalent +# to using a font size of 'smaller', or about 83% of the current font +# size. +# +# The font.weight property has effectively 13 values: normal, bold, +# bolder, lighter, 100, 200, 300, ..., 900. Normal is the same as +# 400, and bold is 700. bolder and lighter are relative values with +# respect to the current weight. +# +# The font.stretch property has 11 values: ultra-condensed, +# extra-condensed, condensed, semi-condensed, normal, semi-expanded, +# expanded, extra-expanded, ultra-expanded, wider, and narrower. This +# property is not currently implemented. +# +# The font.size property is the default font size for text, given in pts. +# 12pt is the standard value. +# +font.family : sans-serif +font.style : normal +font.variant : normal +font.weight : normal +font.stretch : normal +# note that font.size controls default text sizes. To configure +# special text sizes tick labels, axes, labels, title, etc, see the rc +# settings for axes and ticks. Special text sizes can be defined +# relative to font.size, using the following values: xx-small, x-small, +# small, medium, large, x-large, xx-large, larger, or smaller +font.size : 12.0 +font.serif : DejaVu Serif, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif +font.sans-serif: DejaVu Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif +font.cursive : Apple Chancery, Textile, Zapf Chancery, Sand, Script MT, Felipa, cursive +font.fantasy : Comic Sans MS, Chicago, Charcoal, ImpactWestern, Humor Sans, fantasy +font.monospace : DejaVu Sans Mono, Andale Mono, Nimbus Mono L, Courier New, Courier, Fixed, Terminal, monospace + +### TEXT +# text properties used by text.Text. See +# http://matplotlib.org/api/artist_api.html#module-matplotlib.text for more +# information on text properties + +text.color : k + +### LaTeX customizations. See http://www.scipy.org/Wiki/Cookbook/Matplotlib/UsingTex +text.usetex : False # use latex for all text handling. The following fonts + # are supported through the usual rc parameter settings: + # new century schoolbook, bookman, times, palatino, + # zapf chancery, charter, serif, sans-serif, helvetica, + # avant garde, courier, monospace, computer modern roman, + # computer modern sans serif, computer modern typewriter + # If another font is desired which can loaded using the + # LaTeX \usepackage command, please inquire at the + # matplotlib mailing list +text.latex.preamble : # IMPROPER USE OF THIS FEATURE WILL LEAD TO LATEX FAILURES + # AND IS THEREFORE UNSUPPORTED. PLEASE DO NOT ASK FOR HELP + # IF THIS FEATURE DOES NOT DO WHAT YOU EXPECT IT TO. + # preamble is a comma separated list of LaTeX statements + # that are included in the LaTeX document preamble. + # An example: + # text.latex.preamble : \usepackage{bm},\usepackage{euler} + # The following packages are always loaded with usetex, so + # beware of package collisions: color, geometry, graphicx, + # type1cm, textcomp. Adobe Postscript (PSSNFS) font packages + # may also be loaded, depending on your font settings + +text.hinting : auto # May be one of the following: + # 'none': Perform no hinting + # 'auto': Use freetype's autohinter + # 'native': Use the hinting information in the + # font file, if available, and if your + # freetype library supports it + # 'either': Use the native hinting information, + # or the autohinter if none is available. + # For backward compatibility, this value may also be + # True === 'auto' or False === 'none'. +text.hinting_factor : 8 # Specifies the amount of softness for hinting in the + # horizontal direction. A value of 1 will hint to full + # pixels. A value of 2 will hint to half pixels etc. + +text.antialiased : True # If True (default), the text will be antialiased. + # This only affects the Agg backend. + +# The following settings allow you to select the fonts in math mode. +# They map from a TeX font name to a fontconfig font pattern. +# These settings are only used if mathtext.fontset is 'custom'. +# Note that this "custom" mode is unsupported and may go away in the +# future. +mathtext.cal : cursive +mathtext.rm : serif +mathtext.tt : monospace +mathtext.it : serif:italic +mathtext.bf : serif:bold +mathtext.sf : sans\-serif +mathtext.fontset : cm # Should be 'cm' (Computer Modern), 'stix', + # 'stixsans' or 'custom' +mathtext.fallback: cm # Select fallback font from ['cm' (Computer Modern), 'stix' + # 'stixsans'] when a symbol can not be found in one of the + # custom math fonts. Select 'None' to not perform fallback + # and replace the missing character by a dummy. + +mathtext.default : it # The default font to use for math. + # Can be any of the LaTeX font names, including + # the special name "regular" for the same font + # used in regular text. + +### AXES +# default face and edge color, default tick sizes, +# default fontsizes for ticklabels, and so on. See +# http://matplotlib.org/api/axes_api.html#module-matplotlib.axes +axes.facecolor : w # axes background color +axes.edgecolor : k # axes edge color +axes.linewidth : 1.0 # edge linewidth +axes.grid : False # display grid or not +axes.grid.which : major +axes.grid.axis : both +axes.titlesize : large # fontsize of the axes title +axes.titley : 1.0 # at the top, no autopositioning. +axes.titlepad : 5.0 # pad between axes and title in points +axes.titleweight : normal # font weight for axes title +#axes.labelsize : medium # fontsize of the x any y labels +axes.labelpad : 5.0 # space between label and axis +axes.labelweight : normal # weight of the x and y labels +axes.labelcolor : k +axes.axisbelow : False # whether axis gridlines and ticks are below + # the axes elements (lines, text, etc) + +axes.formatter.limits : -7, 7 # use scientific notation if log10 + # of the axis range is smaller than the + # first or larger than the second +axes.formatter.use_locale : False # When True, format tick labels + # according to the user's locale. + # For example, use ',' as a decimal + # separator in the fr_FR locale. +axes.formatter.use_mathtext : False # When True, use mathtext for scientific + # notation. +axes.formatter.useoffset : True # If True, the tick label formatter + # will default to labeling ticks relative + # to an offset when the data range is very + # small compared to the minimum absolute + # value of the data. +axes.formatter.offset_threshold : 2 # When useoffset is True, the offset + # will be used when it can remove + # at least this number of significant + # digits from tick labels. + +axes.unicode_minus : True # use unicode for the minus symbol + # rather than hyphen. See + # http://en.wikipedia.org/wiki/Plus_and_minus_signs#Character_codes +#axes.prop_cycle : cycler('color', 'bgrcmyk') + # color cycle for plot lines + # as list of string colorspecs: + # single letter, long name, or + # web-style hex +axes.autolimit_mode : round_numbers +axes.xmargin : 0 # x margin. See `axes.Axes.margins` +axes.ymargin : 0 # y margin See `axes.Axes.margins` +axes.spines.bottom : True +axes.spines.left : True +axes.spines.right : True +axes.spines.top : True +polaraxes.grid : True # display grid on polar axes +axes3d.grid : True # display grid on 3d axes + +date.autoformatter.year : %Y +date.autoformatter.month : %b %Y +date.autoformatter.day : %b %d %Y +date.autoformatter.hour : %H:%M:%S +date.autoformatter.minute : %H:%M:%S.%f +date.autoformatter.second : %H:%M:%S.%f +date.autoformatter.microsecond : %H:%M:%S.%f + +### TICKS +# see http://matplotlib.org/api/axis_api.html#matplotlib.axis.Tick + +#xtick.top : True # draw ticks on the top side +#xtick.bottom : True # draw ticks on the bottom side +xtick.major.size : 4 # major tick size in points +xtick.minor.size : 2 # minor tick size in points +xtick.minor.visible : False +#xtick.major.width : 0.5 # major tick width in points +#xtick.minor.width : 0.5 # minor tick width in points +xtick.major.pad : 4 # distance to major tick label in points +xtick.minor.pad : 4 # distance to the minor tick label in points +xtick.color : k # color of the tick labels +#xtick.labelsize : medium # fontsize of the tick labels +#xtick.direction : in # direction: in, out, or inout +xtick.major.top : True # draw x axis top major ticks +xtick.major.bottom : True # draw x axis bottom major ticks +xtick.minor.top : True # draw x axis top minor ticks +xtick.minor.bottom : True # draw x axis bottom minor ticks +xtick.alignment : center + +#ytick.left : True # draw ticks on the left side +#ytick.right : True # draw ticks on the right side +ytick.major.size : 4 # major tick size in points +ytick.minor.size : 2 # minor tick size in points +ytick.minor.visible : False +#ytick.major.width : 0.5 # major tick width in points +#ytick.minor.width : 0.5 # minor tick width in points +ytick.major.pad : 4 # distance to major tick label in points +ytick.minor.pad : 4 # distance to the minor tick label in points +ytick.color : k # color of the tick labels +#ytick.labelsize : medium # fontsize of the tick labels +#ytick.direction : in # direction: in, out, or inout +ytick.major.left : True # draw y axis left major ticks +ytick.major.right : True # draw y axis right major ticks +ytick.minor.left : True # draw y axis left minor ticks +ytick.minor.right : True # draw y axis right minor ticks +ytick.alignment : center + +### GRIDS +grid.color : k # grid color +grid.linestyle : : # dotted +grid.linewidth : 0.5 # in points +grid.alpha : 1.0 # transparency, between 0.0 and 1.0 + +### Legend +#legend.fancybox : False # if True, use a rounded box for the + # legend, else a rectangle +legend.loc : upper right +legend.numpoints : 2 # the number of points in the legend line +#legend.fontsize : large +legend.borderpad : 0.4 # border whitespace in fontsize units +legend.markerscale : 1.0 # the relative size of legend markers vs. original +# the following dimensions are in axes coords +legend.labelspacing : 0.5 # the vertical space between the legend entries in fraction of fontsize +legend.handlelength : 2. # the length of the legend lines in fraction of fontsize +legend.handleheight : 0.7 # the height of the legend handle in fraction of fontsize +legend.handletextpad : 0.8 # the space between the legend line and legend text in fraction of fontsize +legend.borderaxespad : 0.5 # the border between the axes and legend edge in fraction of fontsize +legend.columnspacing : 2. # the border between the axes and legend edge in fraction of fontsize +legend.shadow : False +#legend.frameon : True # whether or not to draw a frame around legend +legend.framealpha : None # opacity of legend frame +legend.scatterpoints : 3 # number of scatter points +legend.facecolor : inherit # legend background color (when 'inherit' uses axes.facecolor) +legend.edgecolor : inherit # legend edge color (when 'inherit' uses axes.edgecolor) + + + +### FIGURE +# See http://matplotlib.org/api/figure_api.html#matplotlib.figure.Figure +#figure.titlesize : medium # size of the figure title +figure.titleweight : normal # weight of the figure title +#figure.figsize : 8, 6 # figure size in inches +#figure.dpi : 80 # figure dots per inch +#figure.facecolor : 0.75 # figure facecolor; 0.75 is scalar gray +figure.edgecolor : w # figure edgecolor +figure.autolayout : False # When True, automatically adjust subplot + # parameters to make the plot fit the figure +figure.frameon : True + +# The figure subplot parameters. All dimensions are a fraction of the +# figure width or height +figure.subplot.left : 0.125 # the left side of the subplots of the figure +figure.subplot.right : 0.9 # the right side of the subplots of the figure +figure.subplot.bottom : 0.1 # the bottom of the subplots of the figure +figure.subplot.top : 0.9 # the top of the subplots of the figure +figure.subplot.wspace : 0.2 # the amount of width reserved for space between subplots, + # expressed as a fraction of the average axis width +figure.subplot.hspace : 0.2 # the amount of height reserved for space between subplots, + # expressed as a fraction of the average axis height + +### IMAGES +image.aspect : equal # equal | auto | a number +image.interpolation : bilinear # see help(imshow) for options +#image.cmap : jet # gray | jet etc... +image.lut : 256 # the size of the colormap lookup table +image.origin : upper # lower | upper +image.resample : False +image.composite_image : True + +### CONTOUR PLOTS +contour.negative_linestyle : dashed # dashed | solid +contour.corner_mask : True + +# errorbar props +errorbar.capsize: 3 + +# scatter props +scatter.marker: o + +### Boxplots +boxplot.bootstrap: None +boxplot.boxprops.color: b +boxplot.boxprops.linestyle: - +boxplot.boxprops.linewidth: 1.0 +boxplot.capprops.color: k +boxplot.capprops.linestyle: - +boxplot.capprops.linewidth: 1.0 +boxplot.flierprops.color: b +boxplot.flierprops.linestyle: none +boxplot.flierprops.linewidth: 1.0 +boxplot.flierprops.marker: + +boxplot.flierprops.markeredgecolor: k +boxplot.flierprops.markerfacecolor: auto +boxplot.flierprops.markersize: 6.0 +boxplot.meanline: False +boxplot.meanprops.color: r +boxplot.meanprops.linestyle: - +boxplot.meanprops.linewidth: 1.0 +boxplot.medianprops.color: r +boxplot.meanprops.marker: s +boxplot.meanprops.markerfacecolor: r +boxplot.meanprops.markeredgecolor: k +boxplot.meanprops.markersize: 6.0 +boxplot.medianprops.linestyle: - +boxplot.medianprops.linewidth: 1.0 +boxplot.notch: False +boxplot.patchartist: False +boxplot.showbox: True +boxplot.showcaps: True +boxplot.showfliers: True +boxplot.showmeans: False +boxplot.vertical: True +boxplot.whiskerprops.color: b +boxplot.whiskerprops.linestyle: -- +boxplot.whiskerprops.linewidth: 1.0 +boxplot.whiskers: 1.5 + +### Agg rendering +### Warning: experimental, 2008/10/10 +agg.path.chunksize : 0 # 0 to disable; values in the range + # 10000 to 100000 can improve speed slightly + # and prevent an Agg rendering failure + # when plotting very large data sets, + # especially if they are very gappy. + # It may cause minor artifacts, though. + # A value of 20000 is probably a good + # starting point. +### SAVING FIGURES +path.simplify : True # When True, simplify paths by removing "invisible" + # points to reduce file size and increase rendering + # speed +path.simplify_threshold : 0.1111111111111111 + # The threshold of similarity below which + # vertices will be removed in the simplification + # process +path.snap : True # When True, rectilinear axis-aligned paths will be snapped to + # the nearest pixel when certain criteria are met. When False, + # paths will never be snapped. +path.sketch : None # May be none, or a 3-tuple of the form (scale, length, + # randomness). + # *scale* is the amplitude of the wiggle + # perpendicular to the line (in pixels). *length* + # is the length of the wiggle along the line (in + # pixels). *randomness* is the factor by which + # the length is randomly scaled. + +# the default savefig params can be different from the display params +# e.g., you may want a higher resolution, or to make the figure +# background white +#savefig.dpi : 100 # figure dots per inch +savefig.facecolor : w # figure facecolor when saving +savefig.edgecolor : w # figure edgecolor when saving +savefig.format : png # png, ps, pdf, svg +savefig.bbox : standard # 'tight' or 'standard'. + # 'tight' is incompatible with pipe-based animation + # backends (e.g. 'ffmpeg') but will work with those + # based on temporary files (e.g. 'ffmpeg_file') +savefig.pad_inches : 0.1 # Padding to be used when bbox is set to 'tight' +savefig.transparent : False # setting that controls whether figures are saved with a + # transparent background by default +savefig.orientation : portrait + +# ps backend params +ps.papersize : letter # auto, letter, legal, ledger, A0-A10, B0-B10 +ps.useafm : False # use of afm fonts, results in small files +ps.usedistiller : False # can be: None, ghostscript or xpdf + # Experimental: may produce smaller files. + # xpdf intended for production of publication quality files, + # but requires ghostscript, xpdf and ps2eps +ps.distiller.res : 6000 # dpi +ps.fonttype : 3 # Output Type 3 (Type3) or Type 42 (TrueType) + +# pdf backend params +pdf.compression : 6 # integer from 0 to 9 + # 0 disables compression (good for debugging) +pdf.fonttype : 3 # Output Type 3 (Type3) or Type 42 (TrueType) +pdf.inheritcolor : False +pdf.use14corefonts : False + +# pgf backend params +pgf.texsystem : xelatex +pgf.rcfonts : True +pgf.preamble : + +# svg backend params +svg.image_inline : True # write raster image data directly into the svg file +svg.fonttype : path # How to handle SVG fonts: +# 'none': Assume fonts are installed on the machine where the SVG will be viewed. +# 'path': Embed characters as paths -- supported by most SVG renderers + +# Event keys to interact with figures/plots via keyboard. +# Customize these settings according to your needs. +# Leave the field(s) empty if you don't need a key-map. (i.e., fullscreen : '') + +keymap.fullscreen : f, ctrl+f # toggling +keymap.home : h, r, home # home or reset mnemonic +keymap.back : left, c, backspace # forward / backward keys to enable +keymap.forward : right, v # left handed quick navigation +keymap.pan : p # pan mnemonic +keymap.zoom : o # zoom mnemonic +keymap.save : s, ctrl+s # saving current figure +keymap.quit : ctrl+w, cmd+w # close the current figure +keymap.grid : g # switching on/off a grid in current axes +keymap.yscale : l # toggle scaling of y-axes ('log'/'linear') +keymap.xscale : k, L # toggle scaling of x-axes ('log'/'linear') + +###ANIMATION settings +animation.writer : ffmpeg # MovieWriter 'backend' to use +animation.codec : mpeg4 # Codec to use for writing movie +animation.bitrate: -1 # Controls size/quality tradeoff for movie. + # -1 implies let utility auto-determine +animation.frame_format: png # Controls frame format used by temp files +animation.ffmpeg_path: ffmpeg # Path to ffmpeg binary. Without full path + # $PATH is searched +animation.ffmpeg_args: # Additional arguments to pass to ffmpeg +animation.convert_path: convert # Path to ImageMagick's convert binary. + # On Windows use the full path since convert + # is also the name of a system tool. +animation.convert_args: +animation.html: none + +_internal.classic_mode: True diff --git a/custom cpi styles.txt b/custom cpi styles.txt new file mode 100644 index 0000000..59b1a09 --- /dev/null +++ b/custom cpi styles.txt @@ -0,0 +1,34 @@ +figure.dpi : 200 # figure dots per inch +figure.facecolor : w # figure facecolor +figure.figsize : 7, 4 # figure size in inches +figure.titlesize : 18 # size of the figure title + +lines.linewidth : 2.0 # line width in points + +axes.labelsize : 14 # fontsize of the x any y labels +axes.prop_cycle : cycler('color', ['1f77b4', 'ff7f0e', '2ca02c', 'd62728', '9467bd', '8c564b', 'e377c2', '7f7f7f', 'bcbd22', '17becf']) + # color cycle for plot lines + +legend.fancybox : False # if True, use a rounded box for the +legend.fontsize : 14 # fontsize of the legend labels +legend.frameon : False # whether or not to draw a frame around legend + +xtick.labelsize : 14 # fontsize of the tick labels +xtick.bottom : True # draw ticks on the bottom side +xtick.direction : in # direction: in, out, or inout +xtick.major.width : 1 # major tick width in points +xtick.minor.width : 1 # minor tick width in points +xtick.top : True # draw ticks on the top side + +ytick.direction : in # direction: in, out, or inout +ytick.labelsize : 14 # fontsize of the tick labels +ytick.labelleft : True # show tick labels on the left side +ytick.labelright : False # show tick labels on the right side +ytick.left : True # draw ticks on the left side +ytick.major.width : 1 # major tick width in points +ytick.minor.width : 1 # minor tick width in points +ytick.right : True # draw ticks on the right side + +image.cmap : Paired # gray jet etc... + +savefig.dpi : 200 # figure dots per inch diff --git a/default.mplstyle b/default.mplstyle new file mode 100644 index 0000000..b5430e5 --- /dev/null +++ b/default.mplstyle @@ -0,0 +1,485 @@ +### Classic matplotlib plotting style as of v1.5 + + +### LINES +# See http://matplotlib.org/api/artist_api.html#module-matplotlib.lines for more +# information on line properties. +lines.linewidth : 1.0 # line width in points +lines.linestyle : - # solid line +lines.color : b # has no affect on plot(); see axes.prop_cycle +lines.marker : None # the default marker +lines.markerfacecolor : auto # the default markerfacecolor +lines.markeredgecolor : auto # the default markeredgecolor +lines.markeredgewidth : 0.5 # the line width around the marker symbol +lines.markersize : 6 # markersize, in points +lines.dash_joinstyle : round # miter|round|bevel +lines.dash_capstyle : butt # butt|round|projecting +lines.solid_joinstyle : round # miter|round|bevel +lines.solid_capstyle : projecting # butt|round|projecting +lines.antialiased : True # render lines in antialiased (no jaggies) +lines.dashed_pattern : 6, 6 +lines.dashdot_pattern : 3, 5, 1, 5 +lines.dotted_pattern : 1, 3 +lines.scale_dashes: False + +### Marker props +markers.fillstyle: full + +### PATCHES +# Patches are graphical objects that fill 2D space, like polygons or +# circles. See +# http://matplotlib.org/api/artist_api.html#module-matplotlib.patches +# information on patch properties +patch.linewidth : 1.0 # edge width in points +patch.facecolor : b +patch.force_edgecolor : True +patch.edgecolor : k +patch.antialiased : True # render patches in antialiased (no jaggies) + +hatch.color : k +hatch.linewidth : 1.0 + +hist.bins : 10 + +### FONT +# +# font properties used by text.Text. See +# http://matplotlib.org/api/font_manager_api.html for more +# information on font properties. The 6 font properties used for font +# matching are given below with their default values. +# +# The font.family property has five values: 'serif' (e.g., Times), +# 'sans-serif' (e.g., Helvetica), 'cursive' (e.g., Zapf-Chancery), +# 'fantasy' (e.g., Western), and 'monospace' (e.g., Courier). Each of +# these font families has a default list of font names in decreasing +# order of priority associated with them. When text.usetex is False, +# font.family may also be one or more concrete font names. +# +# The font.style property has three values: normal (or roman), italic +# or oblique. The oblique style will be used for italic, if it is not +# present. +# +# The font.variant property has two values: normal or small-caps. For +# TrueType fonts, which are scalable fonts, small-caps is equivalent +# to using a font size of 'smaller', or about 83% of the current font +# size. +# +# The font.weight property has effectively 13 values: normal, bold, +# bolder, lighter, 100, 200, 300, ..., 900. Normal is the same as +# 400, and bold is 700. bolder and lighter are relative values with +# respect to the current weight. +# +# The font.stretch property has 11 values: ultra-condensed, +# extra-condensed, condensed, semi-condensed, normal, semi-expanded, +# expanded, extra-expanded, ultra-expanded, wider, and narrower. This +# property is not currently implemented. +# +# The font.size property is the default font size for text, given in pts. +# 12pt is the standard value. +# +font.family : sans-serif +font.style : normal +font.variant : normal +font.weight : normal +font.stretch : normal +# note that font.size controls default text sizes. To configure +# special text sizes tick labels, axes, labels, title, etc, see the rc +# settings for axes and ticks. Special text sizes can be defined +# relative to font.size, using the following values: xx-small, x-small, +# small, medium, large, x-large, xx-large, larger, or smaller +font.size : 12.0 +font.serif : DejaVu Serif, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif +font.sans-serif: DejaVu Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif +font.cursive : Apple Chancery, Textile, Zapf Chancery, Sand, Script MT, Felipa, cursive +font.fantasy : Comic Sans MS, Chicago, Charcoal, ImpactWestern, Humor Sans, fantasy +font.monospace : DejaVu Sans Mono, Andale Mono, Nimbus Mono L, Courier New, Courier, Fixed, Terminal, monospace + +### TEXT +# text properties used by text.Text. See +# http://matplotlib.org/api/artist_api.html#module-matplotlib.text for more +# information on text properties + +text.color : k + +### LaTeX customizations. See http://www.scipy.org/Wiki/Cookbook/Matplotlib/UsingTex +text.usetex : False # use latex for all text handling. The following fonts + # are supported through the usual rc parameter settings: + # new century schoolbook, bookman, times, palatino, + # zapf chancery, charter, serif, sans-serif, helvetica, + # avant garde, courier, monospace, computer modern roman, + # computer modern sans serif, computer modern typewriter + # If another font is desired which can loaded using the + # LaTeX \usepackage command, please inquire at the + # matplotlib mailing list +text.latex.preamble : # IMPROPER USE OF THIS FEATURE WILL LEAD TO LATEX FAILURES + # AND IS THEREFORE UNSUPPORTED. PLEASE DO NOT ASK FOR HELP + # IF THIS FEATURE DOES NOT DO WHAT YOU EXPECT IT TO. + # preamble is a comma separated list of LaTeX statements + # that are included in the LaTeX document preamble. + # An example: + # text.latex.preamble : \usepackage{bm},\usepackage{euler} + # The following packages are always loaded with usetex, so + # beware of package collisions: color, geometry, graphicx, + # type1cm, textcomp. Adobe Postscript (PSSNFS) font packages + # may also be loaded, depending on your font settings + +text.hinting : auto # May be one of the following: + # 'none': Perform no hinting + # 'auto': Use freetype's autohinter + # 'native': Use the hinting information in the + # font file, if available, and if your + # freetype library supports it + # 'either': Use the native hinting information, + # or the autohinter if none is available. + # For backward compatibility, this value may also be + # True === 'auto' or False === 'none'. +text.hinting_factor : 8 # Specifies the amount of softness for hinting in the + # horizontal direction. A value of 1 will hint to full + # pixels. A value of 2 will hint to half pixels etc. + +text.antialiased : True # If True (default), the text will be antialiased. + # This only affects the Agg backend. + +# The following settings allow you to select the fonts in math mode. +# They map from a TeX font name to a fontconfig font pattern. +# These settings are only used if mathtext.fontset is 'custom'. +# Note that this "custom" mode is unsupported and may go away in the +# future. +mathtext.cal : cursive +mathtext.rm : serif +mathtext.tt : monospace +mathtext.it : serif:italic +mathtext.bf : serif:bold +mathtext.sf : sans\-serif +mathtext.fontset : cm # Should be 'cm' (Computer Modern), 'stix', + # 'stixsans' or 'custom' +mathtext.fallback: cm # Select fallback font from ['cm' (Computer Modern), 'stix' + # 'stixsans'] when a symbol can not be found in one of the + # custom math fonts. Select 'None' to not perform fallback + # and replace the missing character by a dummy. + +mathtext.default : it # The default font to use for math. + # Can be any of the LaTeX font names, including + # the special name "regular" for the same font + # used in regular text. + +### AXES +# default face and edge color, default tick sizes, +# default fontsizes for ticklabels, and so on. See +# http://matplotlib.org/api/axes_api.html#module-matplotlib.axes +axes.facecolor : w # axes background color +axes.edgecolor : k # axes edge color +axes.linewidth : 1.0 # edge linewidth +axes.grid : False # display grid or not +axes.grid.which : major +axes.grid.axis : both +axes.titlesize : large # fontsize of the axes title +axes.titley : 1.0 # at the top, no autopositioning. +axes.titlepad : 5.0 # pad between axes and title in points +axes.titleweight : normal # font weight for axes title +axes.labelsize : medium # fontsize of the x any y labels +axes.labelpad : 5.0 # space between label and axis +axes.labelweight : normal # weight of the x and y labels +axes.labelcolor : k +axes.axisbelow : False # whether axis gridlines and ticks are below + # the axes elements (lines, text, etc) + +axes.formatter.limits : -7, 7 # use scientific notation if log10 + # of the axis range is smaller than the + # first or larger than the second +axes.formatter.use_locale : False # When True, format tick labels + # according to the user's locale. + # For example, use ',' as a decimal + # separator in the fr_FR locale. +axes.formatter.use_mathtext : False # When True, use mathtext for scientific + # notation. +axes.formatter.useoffset : True # If True, the tick label formatter + # will default to labeling ticks relative + # to an offset when the data range is very + # small compared to the minimum absolute + # value of the data. +axes.formatter.offset_threshold : 2 # When useoffset is True, the offset + # will be used when it can remove + # at least this number of significant + # digits from tick labels. + +axes.unicode_minus : True # use unicode for the minus symbol + # rather than hyphen. See + # http://en.wikipedia.org/wiki/Plus_and_minus_signs#Character_codes +axes.prop_cycle : cycler('color', 'bgrcmyk') + # color cycle for plot lines + # as list of string colorspecs: + # single letter, long name, or + # web-style hex +axes.autolimit_mode : round_numbers +axes.xmargin : 0 # x margin. See `axes.Axes.margins` +axes.ymargin : 0 # y margin See `axes.Axes.margins` +axes.spines.bottom : True +axes.spines.left : True +axes.spines.right : True +axes.spines.top : True +polaraxes.grid : True # display grid on polar axes +axes3d.grid : True # display grid on 3d axes + +date.autoformatter.year : %Y +date.autoformatter.month : %b %Y +date.autoformatter.day : %b %d %Y +date.autoformatter.hour : %H:%M:%S +date.autoformatter.minute : %H:%M:%S.%f +date.autoformatter.second : %H:%M:%S.%f +date.autoformatter.microsecond : %H:%M:%S.%f + +### TICKS +# see http://matplotlib.org/api/axis_api.html#matplotlib.axis.Tick + +xtick.top : True # draw ticks on the top side +xtick.bottom : True # draw ticks on the bottom side +xtick.major.size : 4 # major tick size in points +xtick.minor.size : 2 # minor tick size in points +xtick.minor.visible : False +xtick.major.width : 0.5 # major tick width in points +xtick.minor.width : 0.5 # minor tick width in points +xtick.major.pad : 4 # distance to major tick label in points +xtick.minor.pad : 4 # distance to the minor tick label in points +xtick.color : k # color of the tick labels +xtick.labelsize : medium # fontsize of the tick labels +xtick.direction : in # direction: in, out, or inout +xtick.major.top : True # draw x axis top major ticks +xtick.major.bottom : True # draw x axis bottom major ticks +xtick.minor.top : True # draw x axis top minor ticks +xtick.minor.bottom : True # draw x axis bottom minor ticks +xtick.alignment : center + +ytick.left : True # draw ticks on the left side +ytick.right : True # draw ticks on the right side +ytick.major.size : 4 # major tick size in points +ytick.minor.size : 2 # minor tick size in points +ytick.minor.visible : False +ytick.major.width : 0.5 # major tick width in points +ytick.minor.width : 0.5 # minor tick width in points +ytick.major.pad : 4 # distance to major tick label in points +ytick.minor.pad : 4 # distance to the minor tick label in points +ytick.color : k # color of the tick labels +ytick.labelsize : medium # fontsize of the tick labels +ytick.direction : in # direction: in, out, or inout +ytick.major.left : True # draw y axis left major ticks +ytick.major.right : True # draw y axis right major ticks +ytick.minor.left : True # draw y axis left minor ticks +ytick.minor.right : True # draw y axis right minor ticks +ytick.alignment : center + +### GRIDS +grid.color : k # grid color +grid.linestyle : : # dotted +grid.linewidth : 0.5 # in points +grid.alpha : 1.0 # transparency, between 0.0 and 1.0 + +### Legend +legend.fancybox : False # if True, use a rounded box for the + # legend, else a rectangle +legend.loc : upper right +legend.numpoints : 2 # the number of points in the legend line +legend.fontsize : large +legend.borderpad : 0.4 # border whitespace in fontsize units +legend.markerscale : 1.0 # the relative size of legend markers vs. original +# the following dimensions are in axes coords +legend.labelspacing : 0.5 # the vertical space between the legend entries in fraction of fontsize +legend.handlelength : 2. # the length of the legend lines in fraction of fontsize +legend.handleheight : 0.7 # the height of the legend handle in fraction of fontsize +legend.handletextpad : 0.8 # the space between the legend line and legend text in fraction of fontsize +legend.borderaxespad : 0.5 # the border between the axes and legend edge in fraction of fontsize +legend.columnspacing : 2. # the border between the axes and legend edge in fraction of fontsize +legend.shadow : False +legend.frameon : True # whether or not to draw a frame around legend +legend.framealpha : None # opacity of legend frame +legend.scatterpoints : 3 # number of scatter points +legend.facecolor : inherit # legend background color (when 'inherit' uses axes.facecolor) +legend.edgecolor : inherit # legend edge color (when 'inherit' uses axes.edgecolor) + + + +### FIGURE +# See http://matplotlib.org/api/figure_api.html#matplotlib.figure.Figure +figure.titlesize : medium # size of the figure title +figure.titleweight : normal # weight of the figure title +figure.figsize : 8, 6 # figure size in inches +figure.dpi : 80 # figure dots per inch +figure.facecolor : 0.75 # figure facecolor; 0.75 is scalar gray +figure.edgecolor : w # figure edgecolor +figure.autolayout : False # When True, automatically adjust subplot + # parameters to make the plot fit the figure +figure.frameon : True + +# The figure subplot parameters. All dimensions are a fraction of the +# figure width or height +figure.subplot.left : 0.125 # the left side of the subplots of the figure +figure.subplot.right : 0.9 # the right side of the subplots of the figure +figure.subplot.bottom : 0.1 # the bottom of the subplots of the figure +figure.subplot.top : 0.9 # the top of the subplots of the figure +figure.subplot.wspace : 0.2 # the amount of width reserved for space between subplots, + # expressed as a fraction of the average axis width +figure.subplot.hspace : 0.2 # the amount of height reserved for space between subplots, + # expressed as a fraction of the average axis height + +### IMAGES +image.aspect : equal # equal | auto | a number +image.interpolation : bilinear # see help(imshow) for options +image.cmap : jet # gray | jet etc... +image.lut : 256 # the size of the colormap lookup table +image.origin : upper # lower | upper +image.resample : False +image.composite_image : True + +### CONTOUR PLOTS +contour.negative_linestyle : dashed # dashed | solid +contour.corner_mask : True + +# errorbar props +errorbar.capsize: 3 + +# scatter props +scatter.marker: o + +### Boxplots +boxplot.bootstrap: None +boxplot.boxprops.color: b +boxplot.boxprops.linestyle: - +boxplot.boxprops.linewidth: 1.0 +boxplot.capprops.color: k +boxplot.capprops.linestyle: - +boxplot.capprops.linewidth: 1.0 +boxplot.flierprops.color: b +boxplot.flierprops.linestyle: none +boxplot.flierprops.linewidth: 1.0 +boxplot.flierprops.marker: + +boxplot.flierprops.markeredgecolor: k +boxplot.flierprops.markerfacecolor: auto +boxplot.flierprops.markersize: 6.0 +boxplot.meanline: False +boxplot.meanprops.color: r +boxplot.meanprops.linestyle: - +boxplot.meanprops.linewidth: 1.0 +boxplot.medianprops.color: r +boxplot.meanprops.marker: s +boxplot.meanprops.markerfacecolor: r +boxplot.meanprops.markeredgecolor: k +boxplot.meanprops.markersize: 6.0 +boxplot.medianprops.linestyle: - +boxplot.medianprops.linewidth: 1.0 +boxplot.notch: False +boxplot.patchartist: False +boxplot.showbox: True +boxplot.showcaps: True +boxplot.showfliers: True +boxplot.showmeans: False +boxplot.vertical: True +boxplot.whiskerprops.color: b +boxplot.whiskerprops.linestyle: -- +boxplot.whiskerprops.linewidth: 1.0 +boxplot.whiskers: 1.5 + +### Agg rendering +### Warning: experimental, 2008/10/10 +agg.path.chunksize : 0 # 0 to disable; values in the range + # 10000 to 100000 can improve speed slightly + # and prevent an Agg rendering failure + # when plotting very large data sets, + # especially if they are very gappy. + # It may cause minor artifacts, though. + # A value of 20000 is probably a good + # starting point. +### SAVING FIGURES +path.simplify : True # When True, simplify paths by removing "invisible" + # points to reduce file size and increase rendering + # speed +path.simplify_threshold : 0.1111111111111111 + # The threshold of similarity below which + # vertices will be removed in the simplification + # process +path.snap : True # When True, rectilinear axis-aligned paths will be snapped to + # the nearest pixel when certain criteria are met. When False, + # paths will never be snapped. +path.sketch : None # May be none, or a 3-tuple of the form (scale, length, + # randomness). + # *scale* is the amplitude of the wiggle + # perpendicular to the line (in pixels). *length* + # is the length of the wiggle along the line (in + # pixels). *randomness* is the factor by which + # the length is randomly scaled. + +# the default savefig params can be different from the display params +# e.g., you may want a higher resolution, or to make the figure +# background white +savefig.dpi : 100 # figure dots per inch +savefig.facecolor : w # figure facecolor when saving +savefig.edgecolor : w # figure edgecolor when saving +savefig.format : png # png, ps, pdf, svg +savefig.bbox : standard # 'tight' or 'standard'. + # 'tight' is incompatible with pipe-based animation + # backends (e.g. 'ffmpeg') but will work with those + # based on temporary files (e.g. 'ffmpeg_file') +savefig.pad_inches : 0.1 # Padding to be used when bbox is set to 'tight' +savefig.transparent : False # setting that controls whether figures are saved with a + # transparent background by default +savefig.orientation : portrait + +# ps backend params +ps.papersize : letter # auto, letter, legal, ledger, A0-A10, B0-B10 +ps.useafm : False # use of afm fonts, results in small files +ps.usedistiller : False # can be: None, ghostscript or xpdf + # Experimental: may produce smaller files. + # xpdf intended for production of publication quality files, + # but requires ghostscript, xpdf and ps2eps +ps.distiller.res : 6000 # dpi +ps.fonttype : 3 # Output Type 3 (Type3) or Type 42 (TrueType) + +# pdf backend params +pdf.compression : 6 # integer from 0 to 9 + # 0 disables compression (good for debugging) +pdf.fonttype : 3 # Output Type 3 (Type3) or Type 42 (TrueType) +pdf.inheritcolor : False +pdf.use14corefonts : False + +# pgf backend params +pgf.texsystem : xelatex +pgf.rcfonts : True +pgf.preamble : + +# svg backend params +svg.image_inline : True # write raster image data directly into the svg file +svg.fonttype : path # How to handle SVG fonts: +# 'none': Assume fonts are installed on the machine where the SVG will be viewed. +# 'path': Embed characters as paths -- supported by most SVG renderers + +# Event keys to interact with figures/plots via keyboard. +# Customize these settings according to your needs. +# Leave the field(s) empty if you don't need a key-map. (i.e., fullscreen : '') + +keymap.fullscreen : f, ctrl+f # toggling +keymap.home : h, r, home # home or reset mnemonic +keymap.back : left, c, backspace # forward / backward keys to enable +keymap.forward : right, v # left handed quick navigation +keymap.pan : p # pan mnemonic +keymap.zoom : o # zoom mnemonic +keymap.save : s, ctrl+s # saving current figure +keymap.quit : ctrl+w, cmd+w # close the current figure +keymap.grid : g # switching on/off a grid in current axes +keymap.yscale : l # toggle scaling of y-axes ('log'/'linear') +keymap.xscale : k, L # toggle scaling of x-axes ('log'/'linear') + +###ANIMATION settings +animation.writer : ffmpeg # MovieWriter 'backend' to use +animation.codec : mpeg4 # Codec to use for writing movie +animation.bitrate: -1 # Controls size/quality tradeoff for movie. + # -1 implies let utility auto-determine +animation.frame_format: png # Controls frame format used by temp files +animation.ffmpeg_path: ffmpeg # Path to ffmpeg binary. Without full path + # $PATH is searched +animation.ffmpeg_args: # Additional arguments to pass to ffmpeg +animation.convert_path: convert # Path to ImageMagick's convert binary. + # On Windows use the full path since convert + # is also the name of a system tool. +animation.convert_args: +animation.html: none + +_internal.classic_mode: True diff --git a/test_data.pkl b/test_data.pkl new file mode 100644 index 0000000000000000000000000000000000000000..a338dbe62708da455fe1d3427ab0af1af6a86d98 GIT binary patch literal 48272 zcmaI7cRZHw8#j&$(U6Epi3(-!?QLgoMabUneG4t+lZZ-L6={g9>}ZH6MX9VxiX^Fo zA}xyN{65cLzkh!IaJ{bkzOL(B$MGJ=b)WHzGmkWI{NKO*8M3K7_EeUnv87c;sxXBe zMT=DopfZ9Kqu7zGFh2&vFE%4}*=|Nq0F}aIG1vjDjP#7uCI9!rj8q;<;QzZMJ;R3M zNQNn=f5y=a=L}gJPP;CiBN?GfQkMj>VrfDDyN4@Sn_OhW`Ts6hl**}}VQ+75y+Ho{ z?>`$3R)&AFNs=K4$CHl#{cVQV$(A3o>tv8k5lp!2DT9@t>nj$$mqCtWQoL!E4CF^Y zCI*Mf!nC&KY(~2*3Qh^0u3^Z*oA39(Gz&Qtycj(8!eJX6s$Ieh`nKV*LvEucOCIXg zmZ9e^DWJ+>kJWgSBE+X3nNK(A{C@OQC)q1PrhHS97(*F`jE0a7K^3^_ zZ27yQRT*#AO+61OS4H@1y5YWRRnXI%_2llUAwqxGZ?!}EV5FdJ{m*q)+|qqjVCzMR)V$d$d(7pS_JE0VRoa!&`hdtQ~X({->ZIW&78LkIh= zFTLkwp@V1L!_NGgx)^+S=fn=C4&;?N71JklA?I2f@j*xzG70Oyzv|INV7pxZ>tS7N zur*%!-ws{WQASvI#&xhemyu~_sRPe<@`v2Lb+G1zgr7Nienz9ox*vkND12IQRpW>b z#w7NfPMz0ASIe=f2-45hIwd=qW;)1Q$Lps%qm2N2zm;9&X!epz!}o_aMyp%S*ss%p zjQ56BRWdrLdOQ#&-k}3~dwD~*5u6>sy0zUDW=0`0&;l zU1%$)Tp5wj#g8#RuHalx660z$q=;Ew8T|D3ZQKCpv7mwC+)m_lm12iGDCTm?-JW0=@ za+BviV`xYu>LM>Dy(wo}2Y*F7T83=NdWo<%P`~P6Gi}&AIzR_f|NSd?e_sc;Xx4l9 z^>iWf<)+AiJY6JrODp?G>w=S4N=R)^2ON_($6vhDL5-gE!_72ZBpgYs{MM<9rK+R- zB15{E6mEWFbz2uyO8u$vDm^5aP>w~d)Pw)D_yB8{9`<-#jSxPjk8DN3?+T{+cx~>q zyn8_pTb~uC^3>=fXO;HuI7fYK*i*FJ_^cj&8Kehicj;q~kP+qcYD4f(+?M?>(h!es zeeke8X9y*n+`#Hs@#x0|mU!rRH6Kjx1i4se`)IUi{R>i2mg`B@

L&IT6P(zdC9JP+hFhn^%e$*h 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 z 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 MwW}UFu#M57G5`t42kl>mrS}_7h!~IK6cr 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 P^ywlYj0+B|JMH`*7|Wk| literal 0 HcmV?d00001