Source code for rayoptics.mpl.styledfigure
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright © 2020 Michael J. Hayford
""" manage light and dark interface color schemes
.. Created on Mon Feb 3 22:03:16 2020
.. codeauthor: Michael J. Hayford
"""
from pathlib import Path
from shutil import copy2
import matplotlib
from matplotlib import style
from matplotlib.figure import Figure
from rayoptics.util import colors
[docs]
def copy_styles():
"""Copy rayoptics mpl styles to user's mpl_config dir."""
pth = Path(__file__).resolve().parent
styles_dir = Path(pth / 'styles')
mpl_configdir = Path(matplotlib.get_configdir()) / 'stylelib'
mpl_configdir.mkdir(exist_ok=True)
for mpl_style in styles_dir.glob('*.mplstyle'):
copy2(mpl_style, mpl_configdir)
[docs]
def apply_style(is_dark):
"""Assign a light or dark style to mpl plots."""
pth = Path(__file__).resolve().parent
styles_dir = Path(pth / 'styles')
if is_dark:
style_path = styles_dir / 'Solarize_Dark.mplstyle'
style.use(str(style_path))
else:
style_path = styles_dir / 'Solarize_Light_Blue.mplstyle'
style.use(str(style_path))
[docs]
class StyledFigure(Figure):
"""Provide a standard implementation for mpl styles."""
def __init__(self, **kwargs):
is_dark = kwargs.pop('is_dark', False)
self._rgb = {**colors.accent_colors(is_dark),
**colors.foreground_background(is_dark)}
super().__init__(**kwargs)
self.sync_light_or_dark(is_dark, do_refresh=False)
[docs]
def sync_light_or_dark(self, is_dark, do_refresh=True):
self._rgb = {**colors.accent_colors(is_dark),
**colors.foreground_background(is_dark)}
apply_style(is_dark)
self.set_facecolor(self._rgb['background'])
if hasattr(self, 'ax'):
axes = self.ax
axes.set_facecolor(self._rgb['background1'])
axes.tick_params(
colors=self._rgb['foreground'],
grid_color=self._rgb['background']
)
if do_refresh:
self.refresh()