diff --git a/doc/users/whats_new/rcparams.rst b/doc/users/whats_new/rcparams.rst index f66080d42b79..82b9d30a5581 100644 --- a/doc/users/whats_new/rcparams.rst +++ b/doc/users/whats_new/rcparams.rst @@ -1,5 +1,27 @@ -Added ``svg.hashsalt`` key to rcParams -``````````````````````````````````````` +Configuration (rcParams) +------------------------ + ++----------------------------+--------------------------------------------------+ +| Parameter | Description | ++============================+==================================================+ +|`date.autoformatter.year` | foramt string for 'year' scale dates | ++----------------------------+--------------------------------------------------+ +|`date.autoformatter.month` | format string for 'month' scale dates | ++----------------------------+--------------------------------------------------+ +|`date.autoformatter.day` | format string for 'day' scale dates | ++----------------------------+--------------------------------------------------+ +|`date.autoformatter.hour` | format string for 'hour' scale times | ++----------------------------+--------------------------------------------------+ +|`date.autoformatter.minute` | format string for 'minute' scale times | ++----------------------------+--------------------------------------------------+ +|`date.autoformatter.second` | format string for 'second' scale times | ++----------------------------+--------------------------------------------------+ +|`svg.hashsalt` | see note | ++----------------------------+--------------------------------------------------+ + +``svg.hashsalt`` +```````````````` + If ``svg.hashsalt`` is ``None`` (which it is by default), the svg backend uses ``uuid4`` to generate the hash salt. If it is not ``None``, it must be a string that is used as the hash salt instead of ``uuid4``. This allows for deterministic SVG output. diff --git a/lib/matplotlib/dates.py b/lib/matplotlib/dates.py index fb75e2e0bd9f..dcb029d4293e 100755 --- a/lib/matplotlib/dates.py +++ b/lib/matplotlib/dates.py @@ -113,8 +113,8 @@ unicode_literals) from matplotlib.externals import six -from matplotlib.externals.six.moves import xrange, zip - +from matplotlib.externals.six.moves import zip +from matplotlib import rcParams import re import time import math @@ -629,12 +629,12 @@ class AutoDateFormatter(ticker.Formatter): format string. The default looks like this:: self.scaled = { - 365.0 : '%Y', - 30. : '%b %Y', - 1.0 : '%b %d %Y', - 1./24. : '%H:%M:%S', - 1. / (24. * 60.): '%H:%M:%S.%f', - } + DAYS_PER_YEAR: rcParams['date.autoformat.year'], + DAYS_PER_MONTH: rcParams['date.autoformat.month'], + 1.0: rcParams['date.autoformat.day'], + 1. / HOURS_PER_DAY: rcParams['date.autoformat.hour'], + 1. / (MINUTES_PER_DAY): rcParams['date.autoformat.minute'], + 1. / (SEC_PER_DAY): rcParams['date.autoformat.second']} The algorithm picks the key in the dictionary that is >= the @@ -685,11 +685,14 @@ def __init__(self, locator, tz=None, defaultfmt='%Y-%m-%d'): self._tz = tz self.defaultfmt = defaultfmt self._formatter = DateFormatter(self.defaultfmt, tz) - self.scaled = {DAYS_PER_YEAR: '%Y', - DAYS_PER_MONTH: '%b %Y', - 1.0: '%b %d %Y', - 1. / HOURS_PER_DAY: '%H:%M:%S', - 1. / (MINUTES_PER_DAY): '%H:%M:%S.%f'} + self.scaled = {DAYS_PER_YEAR: rcParams['date.autoformatter.year'], + DAYS_PER_MONTH: rcParams['date.autoformatter.month'], + 1.0: rcParams['date.autoformatter.day'], + 1. / HOURS_PER_DAY: rcParams['date.autoformatter.hour'], + 1. / (MINUTES_PER_DAY): + rcParams['date.autoformatter.minute'], + 1. / (SEC_PER_DAY): + rcParams['date.autoformatter.second']} def __call__(self, x, pos=None): locator_unit_scale = float(self._locator._get_unit()) diff --git a/lib/matplotlib/mpl-data/stylelib/classic.mplstyle b/lib/matplotlib/mpl-data/stylelib/classic.mplstyle index 917b8f202e10..3777ee9b0c37 100644 --- a/lib/matplotlib/mpl-data/stylelib/classic.mplstyle +++ b/lib/matplotlib/mpl-data/stylelib/classic.mplstyle @@ -215,6 +215,13 @@ 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 + ### TICKS # see http://matplotlib.org/api/axis_api.html#matplotlib.axis.Tick diff --git a/lib/matplotlib/rcsetup.py b/lib/matplotlib/rcsetup.py index a52f1199d138..1977a87a1361 100644 --- a/lib/matplotlib/rcsetup.py +++ b/lib/matplotlib/rcsetup.py @@ -1015,6 +1015,13 @@ def validate_hist_bins(s): 'polaraxes.grid': [True, validate_bool], # display polar grid or # not 'axes3d.grid': [True, validate_bool], # display 3d grid + # TODO validate that these are valid datetime format strings + 'date.autoformatter.year': ['%Y', six.text_type], + 'date.autoformatter.month': ['%Y-%m', six.text_type], + 'date.autoformatter.day': ['%Y-%m-%d', six.text_type], + 'date.autoformatter.hour': ['%H:%M', six.text_type], + 'date.autoformatter.minute': ['%H:%M:%S', six.text_type], + 'date.autoformatter.second': ['%H:%M:%S.%f', six.text_type], #legend properties 'legend.fancybox': [False, validate_bool], diff --git a/matplotlibrc.template b/matplotlibrc.template index 45568b04ef33..f52ea5794772 100644 --- a/matplotlibrc.template +++ b/matplotlibrc.template @@ -35,7 +35,7 @@ # You can also deploy your own backend outside of matplotlib by # referring to the module name (which must be in the PYTHONPATH) as # 'module://my_backend'. -backend : %(backend)s +backend : $TEMPLATE_BACKEND # If you are using the Qt4Agg backend, you can choose here # to use the PyQt4 bindings or the newer PySide bindings to @@ -311,6 +311,7 @@ backend : %(backend)s # 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 @@ -328,6 +329,22 @@ backend : %(backend)s #polaraxes.grid : True # display grid on polar axes #axes3d.grid : True # display grid on 3d axes +### DATES +# These control the default format strings used in AutoDateFormatter. +# Any valid format datetime format string can be used (see the python +# `datetime` for details). For example using '%%x' will use the locale date representation +# '%%X' will use the locale time representation and '%%c' will use the full locale datetime +# representation. +# These values map to the scales: +# {'year': 365, 'month': 30, 'day': 1, 'hour': 1/24, 'minute': 1 / (24 * 60)} + +# date.autoformatter.year : %Y +# date.autoformatter.month : %Y-%m +# date.autoformatter.day : %Y-%m-%d +# date.autoformatter.hour : %H:%M +# date.autoformatter.minute : %H:%M:%S +# date.autoformatter.second : %H:%M:%S.%f + ### TICKS # see http://matplotlib.org/api/axis_api.html#matplotlib.axis.Tick diff --git a/setup.py b/setup.py index 07e431ca7364..db00a6ed2241 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ """ from __future__ import print_function, absolute_import - +from string import Template # This needs to be the very first thing to use distribute from distribute_setup import use_setuptools use_setuptools() @@ -230,8 +230,9 @@ def run(self): default_backend = setupext.options['backend'] with open('matplotlibrc.template') as fd: template = fd.read() + template = Template(template) with open('lib/matplotlib/mpl-data/matplotlibrc', 'w') as fd: - fd.write(template % {'backend': default_backend}) + fd.write(template.safe_substitute(TEMPLATE_BACKEND=default_backend)) # Build in verbose mode if requested if setupext.options['verbose']: