There will be maintenance performed on git.ligo.org, chat.ligo.org, containers.lig.org, and docs.ligo.org starting at 9am PDT on Tuesday 18th August 2020. There will be an extremely small period of downtime at the start of the maintenance window as various services are restarted. Please address any comments, questions, or concerns to computing-help@igwn.org.

Commit 3a927f49 authored by Phil Jones's avatar Phil Jones

Cleaning up plotting functions and switching to using `pykat.style` throughout.

parent 8aa7ae70
......@@ -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()
......@@ -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
......@@ -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)
......@@ -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
# 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}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment