From 90e2a10aea5807ca2bfe8091f6a9afca34d97e22 Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Sat, 11 Jul 2015 16:47:09 -0400 Subject: [PATCH 01/11] Creation of the 'classic' matplotlib style --- .../mpl-data/stylelib/classic.mplstyle | 434 ++++++++++++++++++ lib/matplotlib/rcsetup.py | 2 +- 2 files changed, 435 insertions(+), 1 deletion(-) create mode 100644 lib/matplotlib/mpl-data/stylelib/classic.mplstyle diff --git a/lib/matplotlib/mpl-data/stylelib/classic.mplstyle b/lib/matplotlib/mpl-data/stylelib/classic.mplstyle new file mode 100644 index 000000000000..454094c6fe2d --- /dev/null +++ b/lib/matplotlib/mpl-data/stylelib/classic.mplstyle @@ -0,0 +1,434 @@ +### 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.color_cycle +lines.marker : None # the default marker +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 antialised (no jaggies) + +### 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.edgecolor : k +patch.antialiased : True # render patches in antialised (no jaggies) + +### 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 : Bitstream Vera 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: Bitstream Vera Sans, 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, Impact, Western, Humor Sans, fantasy +font.monospace : Bitstream Vera Sans Mono, 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.unicode : False # use "ucs" and "inputenc" LaTeX packages for handling + # unicode strings. +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.dvipnghack : None # some versions of dvipng don't handle alpha + # channel properly. Use True to correct + # and flush ~/.matplotlib/tex.cache + # before testing and False to force + # correction off. None will try and + # guess based on your dvipng version + +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_to_cm : True # When True, use symbols from the Computer Modern + # fonts when a symbol can not be found in one of + # the custom math fonts. + +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.hold : True # whether to clear the axes by default on +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.titlesize : large # fontsize of the axes title +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.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.color_cycle : b, g, r, c, m, y, k # color cycle for plot lines + # as list of string colorspecs: + # single letter, long name, or + # web-style hex +axes.xmargin : 0 # x margin. See `axes.Axes.margins` +axes.ymargin : 0 # y margin See `axes.Axes.margins` + +polaraxes.grid : True # display grid on polar axes +axes3d.grid : True # display grid on 3d axes + +### TICKS +# see http://matplotlib.org/api/axis_api.html#matplotlib.axis.Tick +xtick.major.size : 4 # major tick size in points +xtick.minor.size : 2 # minor tick size in points +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 + +ytick.major.size : 4 # major tick size in points +ytick.minor.size : 2 # minor tick size in points +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 + + +### 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.isaxes : True # this option is internally ignored +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 of legend frame +legend.scatterpoints : 3 # number of scatter points +legend.facecolor : inherit # legend background color (when None inherits from axes.facecolor) +legend.edgecolor : inherit # legend edge color (when None inherits from axes.facecolor) + + + +### 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.max_open_warning : 20 # The maximum number of figures to open through + # the pyplot interface before emitting a warning. + # If less than one this feature is disabled. + +# 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 blank space between subplots +figure.subplot.hspace : 0.2 # the amount of height reserved for white space between subplots + +### 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 + +### 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.1 # 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 but will workd with temporary file based ones: + # e.g. setting animation.writer to ffmpeg will not work, + # use ffmpeg_file instead +savefig.pad_inches : 0.1 # Padding to be used when bbox is set to 'tight' +savefig.jpeg_quality: 95 # when a jpeg is saved, the default quality parameter. +savefig.directory : ~ # default directory in savefig dialog box, + # leave empty to always use current working directory +savefig.transparent : False # setting that controls whether figures are saved with a + # transparent background by default + +# tk backend params +tk.window_focus : False # Maintain shell focus for TkAgg + +# 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.debug : False +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.image_noscale : False # suppress scaling of raster data embedded in SVG +svg.embed_char_paths : True +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 +# 'svgfont': Embed characters as SVG fonts -- supported only by Chrome, +# Opera and Safari + + +# Set the verbose flags. This controls how much information +# matplotlib gives you at runtime and where it goes. The verbosity +# levels are: silent, helpful, debug, debug-annoying. Any level is +# inclusive of all the levels below it. If your setting is "debug", +# you'll get all the debug and helpful messages. When submitting +# problems to the mailing-list, please set verbose to "helpful" or "debug" +# and paste the output into your report. +# +# The "fileo" gives the destination for any calls to verbose.report. +# These objects can a filename, or a filehandle like sys.stdout. +# +# You can override the rc default verbosity from the command line by +# giving the flags --verbose-LEVEL where LEVEL is one of the legal +# levels, e.g., --verbose-helpful. +# +# You can access the verbose instance in your code +# from matplotlib import verbose. +verbose.level : silent # one of silent, helpful, debug, debug-annoying +verbose.fileo : sys.stdout # a log filename, sys.stdout or sys.stderr + +# 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 : L, k # toggle scaling of x-axes ('log'/'linear') +keymap.all_axes : a # enable all axes + +###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.avconv_path: avconv # Path to avconv binary. Without full path + # $PATH is searched +animation.avconv_args: # Additional arguments to pass to avconv +animation.mencoder_path: mencoder + # Path to mencoder binary. Without full path + # $PATH is searched +animation.mencoder_args: # Additional arguments to pass to mencoder +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. diff --git a/lib/matplotlib/rcsetup.py b/lib/matplotlib/rcsetup.py index a54463b1b49c..e3a64ae85efe 100644 --- a/lib/matplotlib/rcsetup.py +++ b/lib/matplotlib/rcsetup.py @@ -679,7 +679,7 @@ def __call__(self, s): 'text.latex.preamble': [[''], validate_stringlist], 'text.latex.preview': [False, validate_bool], 'text.dvipnghack': [None, validate_bool_maybe_none], - 'text.hinting': [True, validate_hinting], + 'text.hinting': ['auto', validate_hinting], 'text.hinting_factor': [8, validate_int], 'text.antialiased': [True, validate_bool], From a3edefbc5d6352b6ffdc7c99f45db6513163ef4c Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Sun, 12 Jul 2015 11:01:03 -0400 Subject: [PATCH 02/11] remove deprecated entry from classic. --- lib/matplotlib/mpl-data/stylelib/classic.mplstyle | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/matplotlib/mpl-data/stylelib/classic.mplstyle b/lib/matplotlib/mpl-data/stylelib/classic.mplstyle index 454094c6fe2d..72add2793734 100644 --- a/lib/matplotlib/mpl-data/stylelib/classic.mplstyle +++ b/lib/matplotlib/mpl-data/stylelib/classic.mplstyle @@ -368,7 +368,6 @@ pgf.preamble : # svg backend params svg.image_inline : True # write raster image data directly into the svg file svg.image_noscale : False # suppress scaling of raster data embedded in SVG -svg.embed_char_paths : True 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 From 4365e954035e2bb6eb3598c398925d9c42242d07 Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Sun, 12 Jul 2015 11:16:05 -0400 Subject: [PATCH 03/11] Have image tests default to 'classic' style. --- lib/matplotlib/style/core.py | 6 ++++++ lib/matplotlib/testing/decorators.py | 14 +++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/style/core.py b/lib/matplotlib/style/core.py index c3b381c2338c..7407e57df38e 100644 --- a/lib/matplotlib/style/core.py +++ b/lib/matplotlib/style/core.py @@ -42,6 +42,9 @@ def is_style_file(filename): def use(style): """Use matplotlib style settings from a style specification. + The style name of 'default' is reserved for reverting back to + the default style settings. + Parameters ---------- style : str, dict, or list @@ -70,6 +73,9 @@ def use(style): if not cbook.is_string_like(style): mpl.rcParams.update(style) continue + elif style == 'default': + mpl.rcdefaults() + continue if style in library: mpl.rcParams.update(library[style]) diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index 7e5480884a40..0f7300945314 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -21,6 +21,7 @@ from matplotlib import ticker from matplotlib import pyplot as plt from matplotlib import ft2font +from matplotlib.style import context as style_context from matplotlib.testing.noseclasses import KnownFailureTest, \ KnownFailureDidNotFailTest, ImageComparisonFailure from matplotlib.testing.compare import comparable_formats, compare_images, \ @@ -132,7 +133,8 @@ class ImageComparisonTest(CleanupTest): def setup_class(cls): CleanupTest.setup_class() - cls._func() + with style_context(cls._style): + cls._func() @staticmethod def remove_text(figure): @@ -206,7 +208,7 @@ def do_test(): def image_comparison(baseline_images=None, extensions=None, tol=13, freetype_version=None, remove_text=False, - savefig_kwarg=None): + savefig_kwarg=None, style='classic'): """ call signature:: @@ -243,6 +245,11 @@ def image_comparison(baseline_images=None, extensions=None, tol=13, *savefig_kwarg*: dict Optional arguments that are passed to the savefig method. + *style*: string + Optional name for the base style to apply to the image + test. The test itself can also apply additional styles + if desired. Defaults to the 'classic' style. + """ if baseline_images is None: @@ -280,7 +287,8 @@ def compare_images_decorator(func): '_tol': tol, '_freetype_version': freetype_version, '_remove_text': remove_text, - '_savefig_kwarg': savefig_kwarg}) + '_savefig_kwarg': savefig_kwarg, + '_style': style}) return new_class return compare_images_decorator From 4ba42f417920d2ac70236c3536f5132073cb7ad6 Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Tue, 14 Jul 2015 15:44:31 -0400 Subject: [PATCH 04/11] Fix some small differences between the encoded defaults and classic. --- lib/matplotlib/mpl-data/stylelib/classic.mplstyle | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/mpl-data/stylelib/classic.mplstyle b/lib/matplotlib/mpl-data/stylelib/classic.mplstyle index 72add2793734..413ae935eaa3 100644 --- a/lib/matplotlib/mpl-data/stylelib/classic.mplstyle +++ b/lib/matplotlib/mpl-data/stylelib/classic.mplstyle @@ -76,7 +76,7 @@ font.size : 12.0 font.serif : Bitstream Vera 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: Bitstream Vera Sans, 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, Impact, Western, Humor Sans, fantasy +font.fantasy : Comic Sans MS, Chicago, Charcoal, ImpactWestern, Humor Sans, fantasy font.monospace : Bitstream Vera Sans Mono, DejaVu Sans Mono, Andale Mono, Nimbus Mono L, Courier New, Courier, Fixed, Terminal, monospace ### TEXT @@ -306,7 +306,8 @@ agg.path.chunksize : 0 # 0 to disable; values in the range path.simplify : True # When True, simplify paths by removing "invisible" # points to reduce file size and increase rendering # speed -path.simplify_threshold : 0.1 # The threshold of similarity below which +path.simplify_threshold : 0.111111111111 + # 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 @@ -409,7 +410,7 @@ 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 : L, k # toggle scaling of x-axes ('log'/'linear') +keymap.xscale : k, L # toggle scaling of x-axes ('log'/'linear') keymap.all_axes : a # enable all axes ###ANIMATION settings From e25ed78de42c286694cdb17a6ca47bb6321f53d3 Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Tue, 14 Jul 2015 17:06:19 -0400 Subject: [PATCH 05/11] Don't use a context manager for default test style handling --- lib/matplotlib/testing/decorators.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index 0f7300945314..7cf50e46a54e 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -15,13 +15,13 @@ import numpy as np import matplotlib as mpl +import matplotlib.style import matplotlib.tests import matplotlib.units from matplotlib import cbook from matplotlib import ticker from matplotlib import pyplot as plt from matplotlib import ft2font -from matplotlib.style import context as style_context from matplotlib.testing.noseclasses import KnownFailureTest, \ KnownFailureDidNotFailTest, ImageComparisonFailure from matplotlib.testing.compare import comparable_formats, compare_images, \ @@ -132,9 +132,20 @@ class ImageComparisonTest(CleanupTest): @classmethod def setup_class(cls): CleanupTest.setup_class() + cls._initial_settings = mpl.rcParams.copy() + try: + matplotlib.style.use(cls._style) + except: + # Restore original settings before raising errors during the update. + mpl.rcParams.update(cls._initial_settings) + raise + + cls._func() - with style_context(cls._style): - cls._func() + @classmethod + def teardown_class(cls): + CleanupTest.teardown_class() + mpl.rcParams.update(cls._initial_settings) @staticmethod def remove_text(figure): From 68209cf6db4901e39ff48f841f317090e41e4a25 Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Tue, 28 Jul 2015 16:00:18 -0400 Subject: [PATCH 06/11] Getting some more rcparams into the classic mode --- .../mpl-data/stylelib/classic.mplstyle | 62 ++++++++++++++++++- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/mpl-data/stylelib/classic.mplstyle b/lib/matplotlib/mpl-data/stylelib/classic.mplstyle index 413ae935eaa3..b41787ee216f 100644 --- a/lib/matplotlib/mpl-data/stylelib/classic.mplstyle +++ b/lib/matplotlib/mpl-data/stylelib/classic.mplstyle @@ -16,6 +16,9 @@ lines.solid_joinstyle : round # miter|round|bevel lines.solid_capstyle : projecting # butt|round|projecting lines.antialiased : True # render lines in antialised (no jaggies) +### Marker props +markers.fillstyle: full + ### PATCHES # Patches are graphical objects that fill 2D space, like polygons or # circles. See @@ -109,6 +112,7 @@ text.latex.preamble : # IMPROPER USE OF THIS FEATURE WILL LEAD TO LATEX FAILURE # beware of package collisions: color, geometry, graphicx, # type1cm, textcomp. Adobe Postscript (PSSNFS) font packages # may also be loaded, depending on your font settings +text.latex.preview : False text.dvipnghack : None # some versions of dvipng don't handle alpha # channel properly. Use True to correct @@ -165,6 +169,8 @@ 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.titleweight : normal # font weight for axes title axes.labelsize : medium # fontsize of the x any y labels @@ -198,7 +204,10 @@ axes.color_cycle : b, g, r, c, m, y, k # color cycle for plot lines # web-style hex 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 @@ -206,6 +215,7 @@ axes3d.grid : True # display grid on 3d axes # see http://matplotlib.org/api/axis_api.html#matplotlib.axis.Tick 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 @@ -216,6 +226,7 @@ xtick.direction : in # direction: in, out, or inout 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 @@ -269,6 +280,7 @@ figure.autolayout : False # When True, automatically adjust subplot figure.max_open_warning : 20 # The maximum number of figures to open through # the pyplot interface before emitting a warning. # If less than one this feature is disabled. +figure.frameon : True # The figure subplot parameters. All dimensions are a fraction of the # figure width or height @@ -292,6 +304,43 @@ image.composite_image : True contour.negative_linestyle : dashed # dashed | solid contour.corner_mask : True +# errorbar props +errorbar.capsize: 3 + +### 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: - +boxplot.flierprops.linewidth: 1.0 +boxplot.flierprops.marker: + +boxplot.flierprops.markeredgecolor: k +boxplot.flierprops.markerfacecolor: b +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.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 @@ -306,7 +355,7 @@ agg.path.chunksize : 0 # 0 to disable; values in the range path.simplify : True # When True, simplify paths by removing "invisible" # points to reduce file size and increase rendering # speed -path.simplify_threshold : 0.111111111111 +path.simplify_threshold : 0.1111111111111111 # The threshold of similarity below which # vertices will be removed in the simplification # process @@ -320,6 +369,7 @@ path.sketch : None # May be none, or a 3-tuple of the form (scale, length, # is the length of the wiggle along the line (in # pixels). *randomness* is the factor by which # the length is randomly scaled. +path.effects : # the default savefig params can be different from the display params # e.g., you may want a higher resolution, or to make the figure @@ -339,6 +389,10 @@ savefig.directory : ~ # default directory in savefig dialog box, # leave empty to always use current working directory savefig.transparent : False # setting that controls whether figures are saved with a # transparent background by default +savefig.frameon : True +savefig.orientation : portrait + +nbagg.transparent: True # tk backend params tk.window_focus : False # Maintain shell focus for TkAgg @@ -413,6 +467,8 @@ keymap.yscale : l # toggle scaling of y-axes ('log'/'linear') keymap.xscale : k, L # toggle scaling of x-axes ('log'/'linear') keymap.all_axes : a # enable all axes +toolbar: toolbar2 + ###ANIMATION settings animation.writer : ffmpeg # MovieWriter 'backend' to use animation.codec : mpeg4 # Codec to use for writing movie @@ -432,3 +488,5 @@ animation.mencoder_args: # Additional arguments to pass to mencoder 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 From c68f759ee1ed1a30edec2bb9f754f6185174ac52 Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Tue, 28 Jul 2015 17:10:20 -0400 Subject: [PATCH 07/11] Added a whats new section on some of the new styles. --- doc/users/whats_new/styles.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 doc/users/whats_new/styles.rst diff --git a/doc/users/whats_new/styles.rst b/doc/users/whats_new/styles.rst new file mode 100644 index 000000000000..77e2974a7497 --- /dev/null +++ b/doc/users/whats_new/styles.rst @@ -0,0 +1,15 @@ +Styles +------ + +Several new styles have been added, including many styles from the Seaborn project. +Additionally, in order to prep for the upcoming 2.0 style-change release, a 'classic' and 'default' style has been added. +For this release, the 'default' and 'classic' styles are identical. +By using them now in your scripts, you can help ensure a smooth transition during future upgrades of matplotlib, so that you can upgrade to the snazzy new defaults when you are ready! :: + + import matplotlib.style + matplotlib.style.use('classic') + +The 'default' style will give you matplotlib's latest plotting styles:: + + matplotlib.style.use('default') + From 8c33113444f208807578d3f948dbc967139fd26e Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Fri, 7 Aug 2015 13:15:14 -0400 Subject: [PATCH 08/11] Remove path.effects from classic style because it doesn't validate as a list --- lib/matplotlib/mpl-data/stylelib/classic.mplstyle | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/matplotlib/mpl-data/stylelib/classic.mplstyle b/lib/matplotlib/mpl-data/stylelib/classic.mplstyle index b41787ee216f..829b750c2cfb 100644 --- a/lib/matplotlib/mpl-data/stylelib/classic.mplstyle +++ b/lib/matplotlib/mpl-data/stylelib/classic.mplstyle @@ -369,7 +369,6 @@ path.sketch : None # May be none, or a 3-tuple of the form (scale, length, # is the length of the wiggle along the line (in # pixels). *randomness* is the factor by which # the length is randomly scaled. -path.effects : # the default savefig params can be different from the display params # e.g., you may want a higher resolution, or to make the figure From 4da0e66b718e6aa50ca692e83bfdafe2412ce210 Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Fri, 7 Aug 2015 16:02:25 -0400 Subject: [PATCH 09/11] Fixed the application of a consistent style to the unit tests --- lib/matplotlib/testing/decorators.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index 7cf50e46a54e..5676ec530715 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -72,8 +72,6 @@ def _do_cleanup(original_units_registry): plt.close('all') gc.collect() - matplotlib.tests.setup() - matplotlib.units.registry.clear() matplotlib.units.registry.update(original_units_registry) warnings.resetwarnings() # reset any warning filters set in tests @@ -83,6 +81,7 @@ class CleanupTest(object): @classmethod def setup_class(cls): cls.original_units_registry = matplotlib.units.registry.copy() + matplotlib.tests.setup() @classmethod def teardown_class(cls): @@ -131,7 +130,6 @@ def check_freetype_version(ver): class ImageComparisonTest(CleanupTest): @classmethod def setup_class(cls): - CleanupTest.setup_class() cls._initial_settings = mpl.rcParams.copy() try: matplotlib.style.use(cls._style) @@ -139,13 +137,18 @@ def setup_class(cls): # Restore original settings before raising errors during the update. mpl.rcParams.update(cls._initial_settings) raise - + # Because the setup of a CleanupTest might involve + # modifying a few rcparams, this setup should come + # last prior to running the image test. + CleanupTest.setup_class() cls._func() @classmethod def teardown_class(cls): - CleanupTest.teardown_class() mpl.rcParams.update(cls._initial_settings) + # Just as the setup of a CleanupTest should come last, + # it would be prudent to make the teardown of CleanupTest last. + CleanupTest.teardown_class() @staticmethod def remove_text(figure): From 7d266fcc5a8abe5d8ac0330e7d255dac8522737f Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Fri, 7 Aug 2015 16:46:07 -0400 Subject: [PATCH 10/11] Getting the CleanupTest and cleanup to do rcparam handling, too --- lib/matplotlib/testing/decorators.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index 5676ec530715..88bdac02a637 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -68,10 +68,12 @@ def failer(*args, **kwargs): return known_fail_decorator -def _do_cleanup(original_units_registry): +def _do_cleanup(original_units_registry, original_settings): plt.close('all') gc.collect() + mpl.rcParams.clear() + mpl.rcParams.update(original_settings) matplotlib.units.registry.clear() matplotlib.units.registry.update(original_units_registry) warnings.resetwarnings() # reset any warning filters set in tests @@ -81,11 +83,13 @@ class CleanupTest(object): @classmethod def setup_class(cls): cls.original_units_registry = matplotlib.units.registry.copy() + cls.original_settings = mpl.rcParams.copy() matplotlib.tests.setup() @classmethod def teardown_class(cls): - _do_cleanup(cls.original_units_registry) + _do_cleanup(cls.original_units_registry, + cls.original_settings) def test(self): self._func() @@ -107,10 +111,12 @@ def cleanup(func): @functools.wraps(func) def wrapped_function(*args, **kwargs): original_units_registry = matplotlib.units.registry.copy() + original_settings = mpl.rcParams.copy() try: func(*args, **kwargs) finally: - _do_cleanup(original_units_registry) + _do_cleanup(original_units_registry, + original_settings) return wrapped_function @@ -135,19 +141,18 @@ def setup_class(cls): matplotlib.style.use(cls._style) except: # Restore original settings before raising errors during the update. + mpl.rcParams.clear() mpl.rcParams.update(cls._initial_settings) raise # Because the setup of a CleanupTest might involve # modifying a few rcparams, this setup should come # last prior to running the image test. CleanupTest.setup_class() + cls.original_settings = cls._initial_settings cls._func() @classmethod def teardown_class(cls): - mpl.rcParams.update(cls._initial_settings) - # Just as the setup of a CleanupTest should come last, - # it would be prudent to make the teardown of CleanupTest last. CleanupTest.teardown_class() @staticmethod From 64211608296e832e06d9e730a07eac71043d749d Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Fri, 7 Aug 2015 16:59:10 -0400 Subject: [PATCH 11/11] Forgot the other use of _do_cleanup() --- lib/matplotlib/testing/decorators.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index 88bdac02a637..b00114ca2b96 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -101,10 +101,12 @@ class CleanupTestCase(unittest.TestCase): def setUpClass(cls): import matplotlib.units cls.original_units_registry = matplotlib.units.registry.copy() + cls.original_settings = mpl.rcParams.copy() @classmethod def tearDownClass(cls): - _do_cleanup(cls.original_units_registry) + _do_cleanup(cls.original_units_registry, + cls.original_settings) def cleanup(func):