diff --git a/pykat/finesse.py b/pykat/finesse.py index 72ee7b88a7c439623d0eed55a18a446c046db92a..4c937c328e7eccfe0469085f7218617b60edb807 100644 --- a/pykat/finesse.py +++ b/pykat/finesse.py @@ -479,17 +479,6 @@ class KatRun(object): if yaxis is not None: kat.yaxis = yaxis - if "log" in kat.yaxis: - if kat.xaxis.scale == "log": - plot_cmd = pyplot.loglog - else: - plot_cmd = pyplot.semilogy - else: - if kat.xaxis.scale == "log": - plot_cmd = pyplot.semilogx - else: - plot_cmd = pyplot.plot - dual_plot = False _func1 = np.abs _func2 = None @@ -497,20 +486,43 @@ class KatRun(object): plot_cmd1 = None plot_cmd2 = None + if "re:im" in kat.yaxis or "abs:deg" in kat.yaxis or "db:deg" in kat.yaxis: + dual_plot = True + + if dual_plot: + fig = plt.figure(width="full", height=1) + ax1 = fig.add_subplot(2, 1, 1) + ax2 = fig.add_subplot(2, 1, 2) + else: + fig = plt.figure(width="full") + ax1 = fig.add_subplot(1, 1, 1) + ax2 = ax1 + + if "log" in kat.yaxis: + if kat.xaxis.scale == "log": + plot_cmd1 = ax1.loglog + plot_cmd2 = ax2.loglog + else: + plot_cmd1 = ax1.semilogy + plot_cmd2 = ax2.semilogy + else: + if kat.xaxis.scale == "log": + plot_cmd1 = ax1.semilogx + plot_cmd2 = ax2.semilogx + else: + plot_cmd1 = ax1.plot + plot_cmd2 = ax2.plot + if "re:im" in kat.yaxis: _func1 = np.real _func2 = np.imag - plot_cmd1 = plot_cmd2 = plot_cmd - dual_plot = True elif "abs:deg" in kat.yaxis: _func1 = np.abs _func2 = lambda x: np.rad2deg(np.angle(x)) - plot_cmd1 = plot_cmd - plot_cmd2 = pyplot.plot if kat.xaxis.scale == "lin" else pyplot.semilogx + plot_cmd2 = ax2.plot if kat.xaxis.scale == "lin" else ax2.semilogx - dual_plot = True elif "db:deg" in kat.yaxis: if "db" not in original_yaxis: _func1 = lambda x: 10*np.log10(x) @@ -519,33 +531,24 @@ class KatRun(object): _func2 = lambda x: np.rad2deg(np.angle(x)) - plot_cmd1 = plot_cmd - plot_cmd2 = pyplot.plot if kat.xaxis.scale == "lin" else pyplot.semilogx + plot_cmd2 = ax2.plot if kat.xaxis.scale == "lin" else ax2.semilogx - dual_plot = True elif "abs" in kat.yaxis: # _func1 = np.abs _func1 = np.real - plot_cmd1 = plot_cmd elif "db" in kat.yaxis: if "db" not in original_yaxis: _func1 = lambda x: 10*np.log10(x) else: _func1 = lambda x: x - plot_cmd1 = plot_cmd elif "deg" in kat.yaxis: _func1 = lambda x: np.rad2deg(np.angle(x)) - plot_cmd1 = plot_cmd - - if dual_plot: - fig = plt.figure(width="full", height=1) - else: - fig = plt.figure(width="full") if detectors is None: detectors = [lbl.split()[0] for lbl in self.ylabels] + detectors = list(set(detectors)) detectors.sort() @@ -553,17 +556,12 @@ class KatRun(object): for det in detectors: if not hasattr(kat, det) or (hasattr(kat, det) and not getattr(kat, det).noplot): - - if dual_plot: - ax = pyplot.subplot(2,1,1) - if styles is not None and det in styles: l, = plot_cmd1(_x, _func1(self[det])/pykat.SI[y1scale], styles[det], label=det) else: l, = plot_cmd1(_x, _func1(self[det])/pykat.SI[y1scale], label=det) if dual_plot: - pyplot.subplot(2,1,2) plot_cmd2(_x, _func2(self[det])/pykat.SI[y2scale], color=l.get_color(), ls=l.get_linestyle(), label=det) if dual_plot: @@ -598,33 +596,33 @@ class KatRun(object): font_label_size = pyplot.rcParams["font.size"]-1 if dual_plot: - ax = pyplot.subplot(2,1,1) - pyplot.xlabel(xlabel, fontsize=font_label_size) - pyplot.ylabel(ylabel, fontsize=font_label_size) - pyplot.xlim(xlim[0], xlim[1]) + #ax = plt.subplot(2,1,1) + ax1.set_xlabel(xlabel, fontsize=font_label_size) + ax1.set_ylabel(ylabel, fontsize=font_label_size) + ax1.set_xlim(xlim[0], xlim[1]) if ylim is not None: - pyplot.ylim(ylim[0],ylim[1]) + ax1.set_ylim(ylim[0],ylim[1]) if title is not None: - pyplot.title(title, fontsize=font_label_size) + ax1.set_title(title, fontsize=font_label_size) - pyplot.subplot(2,1,2) - pyplot.xlabel(x2label, fontsize=font_label_size) - pyplot.ylabel(y2label, fontsize=font_label_size) + #plt.subplot(2,1,2) + ax2.set_xlabel(x2label, fontsize=font_label_size) + ax2.set_ylabel(y2label, fontsize=font_label_size) - pyplot.xlim(x2lim[0], x2lim[1]) + ax2.set_xlim(x2lim[0], x2lim[1]) if y2lim is not None: - pyplot.ylim(y2lim[0],y2lim[1]) + ax2.set_ylim(y2lim[0],y2lim[1]) else: - pyplot.xlabel(xlabel, fontsize=font_label_size) - pyplot.ylabel(ylabel) - pyplot.xlim(xlim[0], xlim[1]) + ax1.set_xlabel(xlabel, fontsize=font_label_size) + ax1.set_ylabel(ylabel) + ax1.set_xlim(xlim[0], xlim[1]) if title is not None: - pyplot.title(title, fontsize=font_label_size) + ax1.set_title(title, fontsize=font_label_size) if ylim is not None: - pyplot.ylim(ylim[0],ylim[1]) + ax1.set_ylim(ylim[0],ylim[1]) pyplot.margins(0, 0.05) pyplot.tight_layout() @@ -3643,4 +3641,4 @@ class kat(object): return bt # printing pykat logo on first input -kat.logo() +#kat.logo() diff --git a/pykat/plotting.py b/pykat/plotting.py index 78ea11ee99d25a900af558481581a758cd4e8745..efed59753ff778f56b7904980f1a2dafd4a20d68 100644 --- a/pykat/plotting.py +++ b/pykat/plotting.py @@ -9,105 +9,93 @@ from __future__ import division from __future__ import print_function from __future__ import unicode_literals -# Should be either display (showing in windows) or paper (saving for paper/report/etc.) -__mode__ = None __DPI__ = None + def in_ipython(): try: - cfg = get_ipython() - return True + __IPYTHON__ except NameError: return False - - -def init_pykat_plotting(mode="display", dpi=100, fmts=None): + else: + return True + + +# `mode` should be either display (showing in windows) +# or paper (saving for paper/report/etc.) +def init_pykat_plotting(mode="display", dpi=None, fmts=None): import matplotlib as mpl - - __DPI__ = int(dpi) - + import pykat.style + if fmts is None: - fmts=['svg', 'pdf'] - + fmts = ['svg'] + if in_ipython(): try: from IPython.display import set_matplotlib_formats - set_matplotlib_formats(*fmts) ipy = get_ipython() ipy.magic("matplotlib inline") - except: + set_matplotlib_formats(*fmts) + except NameError: pass - + if mode == "display": - __mode__ = mode - + pykat.style.use(["default"]) elif mode == "paper": - __mode__ = mode - mpl.use("pgf") + pykat.style.use(["default", "paper"]) + else: + raise (BaseException( + "Plotting mode must be either 'display' or 'paper'.")) - pgf_with_pdflatex = { - "pgf.texsystem": "pdflatex", - "text.usetex": True, - "pgf.preamble": [ - r"\\usepackage{amsmath, amssymb}", - r"\\usepackage{mathtools, siunitx}" , - r"\\usepackage{amsmath}", - r"\\usepackage[utf8x]{inputenc}", - r"\\usepackage[T1]{fontenc}" - ] - } - - mpl.rcParams.update(pgf_with_pdflatex) + if dpi is None: + __DPI__ = mpl.rcParams['figure.dpi'] else: - raise(BaseException("Plotting mode must be either 'display' or 'paper'.")) + __DPI__ = int(dpi) + mpl.rcParams.update({'figure.dpi': __DPI__}) + mpl.rcParams.update({'savefig.dpi': __DPI__}) if (mpl.__version__ < '1.5'): - mpl.rcParams['axes.color_cycle'] = ['b', 'r', 'k', 'g', 'c', 'm', 'y'] - else: - mpl.rcParams['axes.prop_cycle']=mpl.cycler('color', ['b', 'r', 'k', 'g', 'c', 'm', 'y']) - - mpl.rcParams['lines.linewidth'] = 1.2 - mpl.rcParams.update({"figure.figsize": (6, 3.708)}) - mpl.rcParams.update({'font.size': 11}) - mpl.rcParams.update({'figure.dpi': __DPI__}) - mpl.rcParams.update({'savefig.dpi': __DPI__}) - mpl.rcParams.update({'font.family': "serif"}) - mpl.rcParams.update({'axes.grid': True}) - - mpl.rcParams.update({'axes.titlesize': "medium"}) - mpl.rcParams.update({'axes.xmargin': 0}) - mpl.rcParams.update({'legend.fontsize': "small"}) - mpl.rcParams.update({'axes.axisbelow': True}) - mpl.rcParams.update({'grid.linewidth': 0.25}) - mpl.rcParams.update({'grid.linestyle': ":"}) - mpl.rcParams.update({'grid.color': (0.6,0.6,0.6,1)}) - mpl.rcParams.update({'savefig.bbox': "tight"}) - mpl.rcParams.update({'savefig.pad_inches': 0.05}) - mpl.rcParams.update({'xtick.labelsize': "small"}) - mpl.rcParams.update({'ytick.labelsize': "small"}) - mpl.rcParams.update({'axes.formatter.useoffset': True}) - -def figure(width="full", height=0.618, textwidth=6, **kwargs): + # prop_cycle doesn't exist pre-1.5, and unknown rcParams are ignored, + # so we have to hardcode the color cycle + mpl.rcParams.update({'axes.color_cycle': ['0000FF', 'FF0000', '000000', '00FF00', 'FF00FF']}) + + +def figure(width=None, height=None, textwidth=None, **kwargs): """ Options: - width: 'full', 'half' (0.49*textwidth) (default: full) - height: relative height to width (default: 1/golden ratio = 0.618) - textwidth: Width of text in inches (default: 9.84252 in = 25 cm ) + width: 'full', 'half' (0.49*textwidth) (default: None (use current + value)) + height: relative height to width (default: None (use current value)) + textwidth: Width of text in inches (default: None (use current value)) """ + import matplotlib as mpl import matplotlib.pyplot as plt - + fig_size = mpl.rcParams["figure.figsize"] + + if width is None: + width = "full" + if height is None: + height = fig_size[1] / fig_size[0] + if textwidth is None: + textwidth = fig_size[0] + if width == "full": - fig_size = [textwidth, textwidth*height] + fig_size[0] = textwidth elif width == "half": - fig_size = [textwidth*0.49, textwidth*height*0.49] + fig_size[0] = 0.49 * textwidth + fig_size[1] = 0.49 * textwidth * height else: - raise(BaseException("width must be either 'full' or 'half'.")) - + raise (BaseException("width must be either 'full', 'half' or None.")) + fig = plt.figure(figsize=fig_size, dpi=__DPI__) - + return fig - - - - + + +def subplot(*args, **kwargs): + import matplotlib.pyplot as plt + + ax = plt.subplot(*args, **kwargs) + + return ax diff --git a/pykat/style/__init__.py b/pykat/style/__init__.py index bef2862051172d5aa14517020ee11585e9589cd1..ca58205f00fb7de0e6170190f4ba668177896faf 100644 --- a/pykat/style/__init__.py +++ b/pykat/style/__init__.py @@ -8,6 +8,7 @@ style_dir = os.path.split(os.path.realpath(__file__))[0] available = [os.path.splitext(f)[0] for f in os.listdir(style_dir) if f.endswith(".mplstyle")] + def get_style_path(style): if isinstance(style, str) or hasattr(style, 'keys'): # If name is a single str or dict, make it a single element list. @@ -18,10 +19,12 @@ def get_style_path(style): styles)) return styles + def use(style): import matplotlib.pyplot as plt plt.style.use(get_style_path(style)) + def context(style, after_reset=False): import matplotlib.pyplot as plt return plt.style.context(get_style_path(style), after_reset) diff --git a/pykat/style/default.mplstyle b/pykat/style/default.mplstyle index 6a88df766e01b025f4a2bb920d15254c9ec5ee16..ed5dc6cdf515f85f8409179fe88c2054dff559bb 100644 --- a/pykat/style/default.mplstyle +++ b/pykat/style/default.mplstyle @@ -3,15 +3,18 @@ patch.facecolor: r # FONT font.size : 11 +font.family : serif # TEXT text.usetex : False # AXES axes.grid : True -axes.formatter.useoffset : True +axes.formatter.useoffset : False axes.formatter.use_locale : False -axes.prop_cycle: cycler('color', ['0000FF', 'FF0000', '000000', '00FF00', 'FF00FF']) +axes.prop_cycle : cycler('color', ['0000FF', 'FF0000', '000000', '00FF00', 'FF00FF']) +axes.axisbelow : True +axes.xmargin : 0 #TICKS xtick.labelsize : 9 @@ -27,6 +30,9 @@ figure.titlesize : 12 figure.figsize : 6, 3.708 figure.dpi : 96 +# LINES +lines.linewidth : 1.2 + # IMAGES image.cmap : magma image.origin : lower @@ -34,6 +40,7 @@ image.origin : lower # SAVING FIGURES savefig.dpi : 300 savefig.bbox : tight +savefig.pad_inches : 0.05 pdf.compression : 9 pdf.fonttype : 42 diff --git a/pykat/style/paper.mplstyle b/pykat/style/paper.mplstyle index 81ca218e1330a9cc351d944f2d65dab6510e89c5..48d788039e46b1a26f2c4ca4de0af2ec1205ac75 100644 --- a/pykat/style/paper.mplstyle +++ b/pykat/style/paper.mplstyle @@ -1,5 +1,4 @@ # FONT -font.family : serif font.size : 9 # FIGURE @@ -7,3 +6,7 @@ figure.figsize : 6.69291, 4.13645 # TEXT text.usetex : True + +# PGF +pgf.texsystem : pdflatex +pgf.preamble: \usepackage{amsmath}, \usepackage{amssymb}, \usepackage{mathtools}, \usepackage{siunitx}, \usepackage{amsmath}, \usepackage[utf8x]{inputenc}, \usepackage[T1]{fontenc}