Source code for wbia.plottool.__MPL_INIT__

# -*- coding: utf-8 -*-
"""
Notes:
    To use various backends certian packages are required

    PyQt
    ...

    Tk
    pip install
    sudo apt-get install tk
    sudo apt-get install tk-dev

    Wx
    pip install wxPython

    GTK
    pip install PyGTK
    pip install pygobject
    pip install pygobject

    Cairo
    pip install pycairo
    pip install py2cairo
    pip install cairocffi
    sudo apt-get install libcairo2-dev


CommandLine:
    python -m wbia.plottool.draw_func2 --exec-imshow --show --mplbe=GTKAgg
    python -m wbia.plottool.draw_func2 --exec-imshow --show --mplbe=TkAgg
    python -m wbia.plottool.draw_func2 --exec-imshow --show --mplbe=WxAgg
    python -m wbia.plottool.draw_func2 --exec-imshow --show --mplbe=WebAgg
    python -m wbia.plottool.draw_func2 --exec-imshow --show --mplbe=gdk
    python -m wbia.plottool.draw_func2 --exec-imshow --show --mplbe=cairo

"""
import sys
import os
import utool as ut

ut.noinject(__name__, '[plottool.__MPL_INIT__]')

try:
    import builtins

    profile = getattr(builtins, 'profile')
except AttributeError:

[docs] def profile(func): return func
__IS_INITIALIZED__ = False __WHO_INITIALIZED__ = None VERBOSE_MPLINIT = ut.get_argflag(('--verb-mpl', '--verbose')) TARGET_BACKEND = ut.get_argval( ('--mpl-backend', '--mplbe'), type_=str, default=os.environ.get('MPL_BACKEND', None) ) FALLBACK_BACKEND = ut.get_argval( ('--mpl-fallback-backend', '--mplfbbe'), type_=str, default='agg' )
[docs]def get_pyqt(): have_guitool = ut.check_module_installed('guitool') try: if have_guitool: from wbia.guitool import __PYQT__ as PyQt # NOQA pyqt_version = PyQt._internal.GUITOOL_PYQT_VERSION else: try: import PyQt5 as PyQt pyqt_version = 5 except ImportError: import PyQt4 as PyQt pyqt_version = 4 except ImportError: PyQt = None pyqt_version = None return PyQt, pyqt_version
[docs]def get_target_backend(): if ( not sys.platform.startswith('win32') and not sys.platform.startswith('darwin') and os.environ.get('DISPLAY', None) is None ): # Write to files if we cannot display # target_backend = 'PDF' target_backend = FALLBACK_BACKEND else: target_backend = TARGET_BACKEND if target_backend is None: PyQt, pyqt_version = get_pyqt() if pyqt_version is None: print('[!plotttool] WARNING backend fallback to %s' % (FALLBACK_BACKEND,)) target_backend = FALLBACK_BACKEND elif pyqt_version == 4: target_backend = 'Qt4Agg' elif pyqt_version == 5: target_backend = 'Qt5Agg' else: raise ValueError('Unknown pyqt version %r' % (pyqt_version,)) return target_backend
def _init_mpl_rcparams(): import matplotlib as mpl from matplotlib import style # http://matplotlib.org/users/style_sheets.html nogg = ut.get_argflag('--nogg') if not nogg: style.use('ggplot') # style.use(['ggplot']) # print('style.available = %r' % (style.available,)) # style.use(['bmh']) # style.use(['classic']) # import utool # utool.embed() # style.use(['ggplot', 'dark_background']) if ut.get_argflag('--notoolbar'): toolbar = 'None' else: toolbar = 'toolbar2' mpl.rcParams['toolbar'] = toolbar # mpl.rc('text', usetex=False) if ut.get_argflag('--usetex'): # mpl.rc('text', usetex=True) mpl.rcParams['text.usetex'] = True # matplotlib.rcParams['text.latex.preamble']=[r"\usepackage{amsmath}"] mpl.rcParams['text.latex.unicode'] = True mpl_keypress_shortcuts = [ key for key in mpl.rcParams.keys() if key.find('keymap') == 0 ] for key in mpl_keypress_shortcuts: mpl.rcParams[key] = '' CUSTOM_GGPLOT = 1 if CUSTOM_GGPLOT and not nogg: ggplot_style = style.library['ggplot'] # NOQA # print('ggplot_style = %r' % (ggplot_style,)) custom_gg = { 'axes.axisbelow': True, # 'axes.edgecolor': 'white', 'axes.facecolor': '#E5E5E5', 'axes.edgecolor': 'none', # 'axes.facecolor': 'white', 'axes.grid': True, 'axes.labelcolor': '#555555', 'axes.labelsize': 'large', 'axes.linewidth': 1.0, 'axes.titlesize': 'x-large', 'figure.edgecolor': '0.50', 'figure.facecolor': 'white', 'font.size': 10.0, 'grid.color': 'white', 'grid.linestyle': '-', 'patch.antialiased': True, 'patch.edgecolor': '#EEEEEE', 'patch.facecolor': '#348ABD', 'patch.linewidth': 0.5, 'xtick.color': '#555555', 'xtick.direction': 'out', 'ytick.color': '#555555', 'ytick.direction': 'out', 'axes.prop_cycle': mpl.cycler( 'color', [ '#E24A33', '#348ABD', '#988ED5', '#777777', '#FBC15E', '#8EBA42', '#FFB5B8', ], ), } mpl.rcParams.update(custom_gg) NICE_DARK_BG = False if NICE_DARK_BG: dark_style = { 'axes.edgecolor': 'white', 'axes.facecolor': 'black', 'axes.labelcolor': 'white', 'figure.edgecolor': 'black', 'figure.facecolor': 'black', 'grid.color': 'white', 'lines.color': 'white', 'patch.edgecolor': 'white', 'savefig.edgecolor': 'black', 'savefig.facecolor': 'black', 'text.color': 'white', 'xtick.color': 'white', 'ytick.color': 'white', } mpl.rcParams.update(dark_style) mpl.rcParams['figure.subplot.top'] = 0.8 # mpl.rcParams['text'].usetex = False # for key in mpl_keypress_shortcuts: # print('%s = %s' % (key, mpl.rcParams[key])) # Disable mpl shortcuts # mpl.rcParams['toolbar'] = 'None' # mpl.rcParams['interactive'] = True # import matplotlib.pyplot as plt # plt.xkcd() def _mpl_set_backend(target_backend): import matplotlib as mpl if ut.get_argflag('--leave-mpl-backend-alone'): print('[pt] LEAVE THE BACKEND ALONE !!! was specified') print('[pt] not changing mpl backend') else: # mpl.use(target_backend, force=True) mpl.use(target_backend, force=False) current_backend = mpl.get_backend() if not ut.QUIET and ut.VERBOSE: print('[pt] current backend is: %r' % current_backend) def _init_mpl_mainprocess(verbose=VERBOSE_MPLINIT): global __IS_INITIALIZED__ global __WHO_INITIALIZED__ import matplotlib as mpl # mpl.interactive(True) current_backend = mpl.get_backend() target_backend = get_target_backend() if __IS_INITIALIZED__ is True: if verbose: print( '[!plottool] matplotlib has already been initialized. backend=%r' % current_backend ) print('[!plottool] Initially initialized by %r' % __WHO_INITIALIZED__) print( '[!plottool] Trying to be init by %r' % (ut.get_caller_name(N=range(0, 5))) ) return False __IS_INITIALIZED__ = True if verbose: print('[plottool] matplotlib initialized by %r' % __WHO_INITIALIZED__) __WHO_INITIALIZED__ = ut.get_caller_name(N=range(0, 5)) if verbose: print('--- INIT MPL---') print('[pt] current backend is: %r' % current_backend) print('[pt] mpl.use(%r)' % target_backend) if current_backend != target_backend: _mpl_set_backend(target_backend) _init_mpl_rcparams()
[docs]@profile def init_matplotlib(verbose=VERBOSE_MPLINIT): if ut.in_main_process(): PyQt, pyqt_version = get_pyqt() return _init_mpl_mainprocess(verbose=verbose)