m-thesis-introduction/fourier/myscriptlib/__init__.py

78 lines
2.5 KiB
Python

"""
Functions for easy script writing
mostly for simpler figure saving from cli
"""
import matplotlib.pyplot as plt
import numpy as np
import os.path as path
from argparse import ArgumentParser
def ArgumentParserWithFigure(*args, **kwargs):
parser = ArgumentParser(*args, **kwargs)
parser.add_argument("fname", metavar="path/to/figure[/]", nargs="?", help="Location for generated figure, will append __file__ if a directory. If not supplied, figure is shown.")
return parser
def save_all_figs_to_path_or_show(fnames, figs=None, default_basename=None, default_extensions=['.pdf', '.png']):
"""
Save all figures to fnames.
If fnames is empty, simply call plt.show()
"""
if not fnames:
# empty list, False, None
plt.show()
return
if figs is None:
figs = [plt.figure(i) for i in plt.get_fignums()]
default_basename = path.basename(default_basename)
# singular value
if isinstance(fnames, (str, True)):
fnames = [fnames]
if len(fnames) == len(figs):
fnames_list = zip(figs, fnames, False)
elif len(fnames) == 1:
tmp_fname = fnames[0] #needed for generator
fnames_list = ( (fig, tmp_fname, len(figs) > 1) for fig in figs)
else:
# outer product magic
fnames_list = ( (fig,fname, False) for fname in fnames for fig in figs )
del fnames
# format fnames
pad_width = max(2, int(np.floor(np.log10(len(figs))+1)))
fig_fnames = []
for fig, fnames, append_num in fnames_list:
if not hasattr(fnames, '__len__') or isinstance(fnames, str):
# single name
fnames = [fnames]
new_fnames = []
for fname in fnames:
if path.isdir(fname):
if default_basename is not None:
fname = path.join(fname, path.splitext(default_basename)[0]) # leave off extension
elif hasattr(fig, 'basefilename'):
fname = path.join(fname, path.splitext(fig.basefilename)[0]) # leave off extension
if append_num is True:
fname += ("_fig{:0"+str(pad_width)+"d}").format(fig.number)
if not path.splitext(fname)[1]: # no extension
for ext in default_extensions:
new_fnames.append(fname+ext)
else:
new_fnames.append(fname)
fig_fnames.append(new_fnames)
# save files
for fnames, fig in zip(fig_fnames, figs):
for fname in fnames:
fig.savefig(fname, transparent=True)