From 5fd2f1c62e5ef816665021bedf8428a4f855cc54 Mon Sep 17 00:00:00 2001 From: "J.R. Leeman" Date: Tue, 2 Jan 2018 13:19:30 -0700 Subject: [PATCH] Add high contrast functionality to timestamp --- metpy/plots/_util.py | 14 ++++++++++++-- .../test_add_timestamp_high_contrast.png | Bin 0 -> 16343 bytes metpy/plots/tests/test_util.py | 10 ++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 metpy/plots/tests/baseline/test_add_timestamp_high_contrast.png diff --git a/metpy/plots/_util.py b/metpy/plots/_util.py index 48fd108c9e0..bacead62d3e 100644 --- a/metpy/plots/_util.py +++ b/metpy/plots/_util.py @@ -7,6 +7,7 @@ import posixpath from matplotlib.collections import LineCollection +import matplotlib.patheffects as mpatheffects from matplotlib.pyplot import imread import numpy as np import pkg_resources @@ -14,7 +15,7 @@ from ..units import concatenate -def add_timestamp(ax, time=None, x=0.99, y=-0.04, ha='right', **kwargs): +def add_timestamp(ax, time=None, x=0.99, y=-0.04, ha='right', high_contrast=False, **kwargs): """Add a timestamp at plot creation time. Adds an ISO format timestamp with the time of plot creation to the plot. @@ -31,6 +32,8 @@ def add_timestamp(ax, time=None, x=0.99, y=-0.04, ha='right', **kwargs): Relative y position on the axes of the timestamp ha : str Horizontal alignment of the time stamp string + high_contrast : bool + Outline text for increased contrast Returns ------- @@ -38,10 +41,17 @@ def add_timestamp(ax, time=None, x=0.99, y=-0.04, ha='right', **kwargs): The `matplotlib.text.Text` instance created """ + if high_contrast: + text_args = {'color': 'white', + 'path_effects': + [mpatheffects.withStroke(linewidth=2, foreground='black')]} + else: + text_args = {} + text_args.update(**kwargs) if not time: time = datetime.utcnow() timestr = datetime.strftime(time, 'Created: %Y-%m-%dT%H:%M:%SZ') - return ax.text(x, y, timestr, ha=ha, transform=ax.transAxes, **kwargs) + return ax.text(x, y, timestr, ha=ha, transform=ax.transAxes, **text_args) def _add_logo(fig, x=10, y=25, zorder=100, which='metpy', size='small', **kwargs): diff --git a/metpy/plots/tests/baseline/test_add_timestamp_high_contrast.png b/metpy/plots/tests/baseline/test_add_timestamp_high_contrast.png new file mode 100644 index 0000000000000000000000000000000000000000..350c76a7f5796504ab1f07b532d63944ae9244b7 GIT binary patch literal 16343 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 cvrR#{kKuuydD<;->Jp`SO