From e5c2dda8935c26b1722ef45155fdb28cd46152aa Mon Sep 17 00:00:00 2001 From: Nelle Varoquaux Date: Sat, 28 Jan 2017 10:04:52 -0800 Subject: [PATCH 1/2] FIX ytick vertical alignment can now be specified This patch adds a new rcParams allowing to set label vertical alignment. The sole reason for the existance of this new parameter is to allow user to reset the style to before 2.0 for testing purposes. closes #7905 --- doc/users/dflt_style_changes.rst | 4 ++++ lib/matplotlib/axes/_base.py | 16 ++++++++-------- lib/matplotlib/rcsetup.py | 6 ++++++ ..._tick_label_multiple_old_label_alignment.png | Bin 0 -> 8084 bytes lib/matplotlib/tests/test_axes.py | 9 +++++++++ 5 files changed, 27 insertions(+), 8 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/bar_tick_label_multiple_old_label_alignment.png diff --git a/doc/users/dflt_style_changes.rst b/doc/users/dflt_style_changes.rst index 9414404b8067..6c29bd0135fe 100644 --- a/doc/users/dflt_style_changes.rst +++ b/doc/users/dflt_style_changes.rst @@ -15,9 +15,13 @@ values is a single line of python mpl.style.use('classic') +Note that to revert the position of tick labels, you need in addition to set +the rcParams `ytick.alignment` to "center". + See :ref:`customizing-with-matplotlibrc-files` for details about how to persistently and selectively revert many of these changes. + .. contents:: Table of Contents :depth: 2 :local: diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index 94b3f3b255b8..25697ba292b9 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -795,10 +795,11 @@ def get_yaxis_text1_transform(self, pad_points): place axis elements in different locations. """ + labels_valign = matplotlib.rcParams["ytick.alignment"] return (self.get_yaxis_transform(which='tick1') + mtransforms.ScaledTranslation(-1 * pad_points / 72.0, 0, self.figure.dpi_scale_trans), - "center_baseline", "right") + labels_valign, "right") def get_yaxis_text2_transform(self, pad_points): """ @@ -821,10 +822,12 @@ def get_yaxis_text2_transform(self, pad_points): place axis elements in different locations. """ + labels_valign = matplotlib.rcParams["ytick.alignment"] + return (self.get_yaxis_transform(which='tick2') + mtransforms.ScaledTranslation(pad_points / 72.0, 0, self.figure.dpi_scale_trans), - "center_baseline", "left") + labels_valign, "left") def _update_transScale(self): self.transScale.set( @@ -2540,13 +2543,10 @@ def ticklabel_format(self, **kwargs): raise ValueError("scilimits must be a sequence of 2 integers") if style[:3] == 'sci': sb = True - elif style in ['plain', 'comma']: + elif style == 'plain': sb = False - if style == 'plain': - cb = False - else: - cb = True - raise NotImplementedError("comma style remains to be added") + elif style == 'comma': + raise NotImplementedError("comma style remains to be added") elif style == '': sb = None else: diff --git a/lib/matplotlib/rcsetup.py b/lib/matplotlib/rcsetup.py index e7d6bccad962..0b9a93fc0b19 100644 --- a/lib/matplotlib/rcsetup.py +++ b/lib/matplotlib/rcsetup.py @@ -467,6 +467,11 @@ def validate_font_properties(s): 'verbose', ['silent', 'helpful', 'debug', 'debug-annoying']) +validate_alignment = ValidateInStrings( + 'alignment', + ['center', 'top', 'bottom', 'baseline', + 'center_baseline']) + def validate_whiskers(s): if s == 'range': return 'range' @@ -1218,6 +1223,7 @@ def validate_animation_writer_path(p): # fontsize of the ytick labels 'ytick.labelsize': ['medium', validate_fontsize], 'ytick.direction': ['out', six.text_type], # direction of yticks + 'ytick.alignment': ["center_baseline", validate_alignment], 'grid.color': ['#b0b0b0', validate_color], # grid color 'grid.linestyle': ['-', six.text_type], # solid diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bar_tick_label_multiple_old_label_alignment.png b/lib/matplotlib/tests/baseline_images/test_axes/bar_tick_label_multiple_old_label_alignment.png new file mode 100644 index 0000000000000000000000000000000000000000..11523f3083635ad09351156659fa78a46b978dbc GIT binary patch literal 8084 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 Date: Sat, 28 Jan 2017 11:37:55 -0800 Subject: [PATCH 2/2] MAINT created a new private _classic_test stylesheet This allows the public classic stylesheet to be 'more' backward compatible --- doc/users/dflt_style_changes.rst | 3 - .../mpl-data/stylelib/_classic_test.mplstyle | 526 ++++++++++++++++++ .../mpl-data/stylelib/classic.mplstyle | 1 + lib/matplotlib/testing/decorators.py | 54 +- lib/matplotlib/tests/test_backend_pgf.py | 12 +- lib/matplotlib/tests/test_ticker.py | 4 +- 6 files changed, 562 insertions(+), 38 deletions(-) create mode 100644 lib/matplotlib/mpl-data/stylelib/_classic_test.mplstyle diff --git a/doc/users/dflt_style_changes.rst b/doc/users/dflt_style_changes.rst index 6c29bd0135fe..22915d15bb60 100644 --- a/doc/users/dflt_style_changes.rst +++ b/doc/users/dflt_style_changes.rst @@ -15,9 +15,6 @@ values is a single line of python mpl.style.use('classic') -Note that to revert the position of tick labels, you need in addition to set -the rcParams `ytick.alignment` to "center". - See :ref:`customizing-with-matplotlibrc-files` for details about how to persistently and selectively revert many of these changes. diff --git a/lib/matplotlib/mpl-data/stylelib/_classic_test.mplstyle b/lib/matplotlib/mpl-data/stylelib/_classic_test.mplstyle new file mode 100644 index 000000000000..02e08fa7f93e --- /dev/null +++ b/lib/matplotlib/mpl-data/stylelib/_classic_test.mplstyle @@ -0,0 +1,526 @@ +### 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.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.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.latex.preview : False + +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.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.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 + +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 + +### 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 blank space between subplots, + # expressed as a fraction of the average axis width +figure.subplot.hspace : 0.2 # the amount of height reserved for white 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 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.transparent : False # setting that controls whether figures are saved with a + # transparent background by default +savefig.frameon : True +savefig.orientation : portrait + +nbagg.transparent: True + +# 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.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 : k, L # 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. +animation.convert_args: +animation.html: none + +_internal.classic_mode: True diff --git a/lib/matplotlib/mpl-data/stylelib/classic.mplstyle b/lib/matplotlib/mpl-data/stylelib/classic.mplstyle index 02e08fa7f93e..999758da2e2b 100644 --- a/lib/matplotlib/mpl-data/stylelib/classic.mplstyle +++ b/lib/matplotlib/mpl-data/stylelib/classic.mplstyle @@ -271,6 +271,7 @@ 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 diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index 8ab7e848945f..a74a254572b7 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -11,9 +11,9 @@ import warnings import unittest -# Note - don't import nose up here - import it only as needed in functions. This -# allows other functions here to be used by pytest-based testing suites without -# requiring nose to be installed. +# Note - don't import nose up here - import it only as needed in functions. +# This allows other functions here to be used by pytest-based testing suites +# without requiring nose to be installed. import matplotlib as mpl @@ -158,7 +158,7 @@ def wrapped_callable(*args, **kwargs): return make_cleanup else: result = make_cleanup(style) - style = 'classic' + style = '_classic_test' return result @@ -267,7 +267,8 @@ def setup(self): 'Figures and baseline_images count are not the same' ' (`%s`)' % getattr(func, '__qualname__', func.__name__)) except: - # Restore original settings before raising errors during the update. + # Restore original settings before raising errors during the + # update. self.teardown_class() raise @@ -366,43 +367,42 @@ def runner_wrapper(): def image_comparison(baseline_images=None, extensions=None, tol=0, freetype_version=None, remove_text=False, - savefig_kwarg=None, style='classic'): + savefig_kwarg=None, style='_classic_test'): """ Compare images generated by the test with those specified in *baseline_images*, which must correspond else an ImageComparisonFailure exception will be raised. - Keyword arguments: + Arguments + --------- + baseline_images : list + A list of strings specifying the names of the images generated by + calls to :meth:`matplotlib.figure.savefig`. - *baseline_images*: list - A list of strings specifying the names of the images generated - by calls to :meth:`matplotlib.figure.savefig`. - - *extensions*: [ None | list ] - - If *None*, default to all supported extensions. + extensions : [ None | list ] + If None, defaults to all supported extensions. Otherwise, a list of extensions to test. For example ['png','pdf']. - *tol*: (default 0) + tol : float, optional, default: 0 The RMS threshold above which the test is considered failed. - *freetype_version*: str or tuple - The expected freetype version or range of versions for this - test to pass. + freetype_version : str or tuple + The expected freetype version or range of versions for this test to + pass. - *remove_text*: bool - Remove the title and tick text from the figure before - comparison. This does not remove other, more deliberate, - text, such as legends and annotations. + remove_text : bool + Remove the title and tick text from the figure before comparison. + This does not remove other, more deliberate, text, such as legends and + annotations. - *savefig_kwarg*: dict + 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. + 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_test' style. """ if baseline_images is None: diff --git a/lib/matplotlib/tests/test_backend_pgf.py b/lib/matplotlib/tests/test_backend_pgf.py index 180cd26aa977..bd466859aa7a 100644 --- a/lib/matplotlib/tests/test_backend_pgf.py +++ b/lib/matplotlib/tests/test_backend_pgf.py @@ -83,7 +83,7 @@ def create_figure(): # test compiling a figure to pdf with xelatex @needs_xelatex -@cleanup(style='classic') +@cleanup(style='_classic_test') @switch_backend('pgf') def test_xelatex(): rc_xelatex = {'font.family': 'serif', @@ -95,7 +95,7 @@ def test_xelatex(): # test compiling a figure to pdf with pdflatex @needs_pdflatex -@cleanup(style='classic') +@cleanup(style='_classic_test') @switch_backend('pgf') def test_pdflatex(): import os @@ -117,7 +117,7 @@ def test_pdflatex(): # test updating the rc parameters for each figure @needs_xelatex @needs_pdflatex -@cleanup(style='classic') +@cleanup(style='_classic_test') @switch_backend('pgf') def test_rcupdate(): rc_sets = [] @@ -148,7 +148,7 @@ def test_rcupdate(): # test backend-side clipping, since large numbers are not supported by TeX @needs_xelatex -@cleanup(style='classic') +@cleanup(style='_classic_test') @switch_backend('pgf') def test_pathclip(): rc_xelatex = {'font.family': 'serif', @@ -165,7 +165,7 @@ def test_pathclip(): # test mixed mode rendering @needs_xelatex -@cleanup(style='classic') +@cleanup(style='_classic_test') @switch_backend('pgf') def test_mixedmode(): rc_xelatex = {'font.family': 'serif', @@ -180,7 +180,7 @@ def test_mixedmode(): # test bbox_inches clipping @needs_xelatex -@cleanup(style='classic') +@cleanup(style='_classic_test') @switch_backend('pgf') def test_bbox_inches(): rc_xelatex = {'font.family': 'serif', diff --git a/lib/matplotlib/tests/test_ticker.py b/lib/matplotlib/tests/test_ticker.py index 159379b27c27..98f96f05e6a3 100644 --- a/lib/matplotlib/tests/test_ticker.py +++ b/lib/matplotlib/tests/test_ticker.py @@ -13,7 +13,7 @@ import warnings -@cleanup(style='classic') +@cleanup(style='_classic_test') def test_MaxNLocator(): loc = mticker.MaxNLocator(nbins=5) test_value = np.array([20., 40., 60., 80., 100.]) @@ -174,7 +174,7 @@ def test_SymmetricalLogLocator_set_params(): assert sym.numticks == 8 -@cleanup(style='classic') +@cleanup(style='_classic_test') @pytest.mark.parametrize('left, right, offset', [(123, 189, 0), (-189, -123, 0),