#!/usr/bin/env python
"""
Some setup for improved latex/pdf output
at top of workbook, use:
.. code:: python
from ipynb_latex_setup import *
"""
from __future__ import division as _division
# Py2/Py3 compatibility
# =====================
from __future__ import print_function as _print_function
import warnings
warnings.warn(
"this approach is now deprecated, "
"instead please use\n`from ipypublish.scripts import nb_setup`\n"
"then use the individual functions it provides to setup matplotlib, etc",
DeprecationWarning,
stacklevel=2,
)
# PYTHON
# =======
# IPYTHON
# =======
try:
from IPython import get_ipython
from IPython.display import Image, Latex
from IPython.display import set_matplotlib_formats
_ipy_present = True
except ImportError:
_ipy_present = False
if _ipy_present:
ipython = get_ipython()
if ipython is not None:
try:
ipython.magic("config InlineBackend.figure_format = 'svg'")
ipython.magic("matplotlib inline")
set_matplotlib_formats("pdf", "svg")
except Exception:
pass
# NUMPY
# =====
try:
import numpy as np
except ImportError:
pass
# MATPLOTLIB
# ===========
try:
import matplotlib as mpl
_mpl_present = True
except ImportError:
_mpl_present = False
if _mpl_present:
mpl.rcParams["savefig.dpi"] = 75
mpl.rcParams["figure.figsize"] = (7, 4)
mpl.rcParams["figure.autolayout"] = False
mpl.rcParams["axes.labelsize"] = 18
mpl.rcParams["axes.titlesize"] = 20
mpl.rcParams["font.size"] = 16
mpl.rcParams["lines.linewidth"] = 2.0
mpl.rcParams["lines.markersize"] = 8
mpl.rcParams["legend.fontsize"] = 14
mpl.rcParams["text.usetex"] = True
mpl.rcParams["font.family"] = "serif"
mpl.rcParams["font.serif"] = "cm"
mpl.rcParams["text.latex.preamble"] = r"\usepackage{subdepth}, \usepackage{type1cm}"
# PANDAS
# ======
try:
import pandas as pd
_pandas_present = True
except ImportError:
_pandas_present = False
if _pandas_present and ipython:
pd.set_option("display.latex.repr", True)
pd.set_option("display.latex.longtable", False)
pd.set_option("display.latex.escape", True)
# SYMPY
# =====
try:
import sympy as sym
_sympy_present = True
except ImportError:
_sympy_present = False
if _sympy_present:
sym.init_printing(use_latex=True)
# IMAGE ARRANGEMENT with PIL
# ==========================
try:
from PIL import Image as PImage
_pil_present = True
except ImportError:
_pil_present = False
if _pil_present:
[docs] def create_test_image(size=(50, 50)):
from io import BytesIO
file = BytesIO()
image = PImage.new("RGBA", size=size, color=(155, 0, 0))
image.save(file, "png")
file.name = "test.png"
file.seek(0)
return file
[docs] def images_read(paths):
"""read a list of image paths to a list of PIL.IMAGE instances """
return [PImage.open(i).convert("RGBA") for i in paths]
[docs] def images_hconcat(images, width=700, height=700, gap=0, aspaths=True):
"""concatenate multiple images horizontally
Parameters
----------
images : list
if aspaths=True, list of path strings, else list of PIL.Image instances
width : int or list[int]
maximum width of final image, or of individual images
height : int or list[int]
maximum height of final image, or of individual images
gap : int
size of space between images
Returns
-------
image : PIL.Image
Examples
--------
>>> img_path = create_test_image(size=(50,50))
>>> img = images_hconcat([img_path,img_path])
>>> img.size
(100, 50)
>>> img_path = create_test_image(size=(50,50))
>>> img = images_hconcat([img_path,img_path],width=40,height=40)
>>> img.size
(40, 20)
>>> img_path = create_test_image(size=(50,50))
>>> img = images_hconcat([img_path,img_path],width=[40,30])
>>> img.size
(70, 40)
>>> img_path = create_test_image(size=(50,50))
>>> img = images_hconcat([img_path,img_path],gap=10)
>>> img.size
(110, 50)
"""
images = images_read(images) if aspaths else images
if not isinstance(width, list):
widths = [width for _ in images]
else:
widths = width[:]
width = sum(widths) + gap * (len(images) - 1)
if not isinstance(height, list):
heights = [height for _ in images]
else:
heights = height[:]
height = sum(heights)
for im, w, h in zip(images, widths, heights):
im.thumbnail((w, h), PImage.ANTIALIAS)
widths, heights = zip(*(i.size for i in images))
total_width = sum(widths) + gap * (len(images) - 1)
max_height = max(heights)
new_im = PImage.new("RGBA", (total_width, max_height))
x_offset = 0
for im in images:
new_im.paste(im, (x_offset, 0), mask=im)
x_offset += im.size[0] + gap
new_im.thumbnail((width, height), PImage.ANTIALIAS)
return new_im
[docs] def images_vconcat(images, width=700, height=700, gap=0, aspaths=True):
"""concatenate multiple images vertically
Parameters
----------
images : list
if aspaths=True, list of path strings, else list of PIL.Image instances
width : int or list[int]
maximum width of final image, or of individual images
height : int or list[int]
maximum height of final image, or of individual images
gap : int
size of space between images
Returns
-------
image : PIL.Image
Examples
--------
>>> img_path = create_test_image(size=(50,50))
>>> img = images_vconcat([img_path,img_path])
>>> img.size
(50, 100)
>>> img_path = create_test_image(size=(50,50))
>>> img = images_vconcat([img_path,img_path],width=40,height=40)
>>> img.size
(20, 40)
>>> img_path = create_test_image(size=(50,50))
>>> img = images_vconcat([img_path,img_path],width=[40,30])
>>> img.size
(40, 70)
>>> img_path = create_test_image(size=(50,50))
>>> img = images_vconcat([img_path,img_path],gap=10)
>>> img.size
(50, 110)
"""
images = images_read(images) if aspaths else images
if not isinstance(width, list):
widths = [width for _ in images]
else:
widths = width[:]
width = sum(widths)
if not isinstance(height, list):
heights = [height for _ in images]
else:
heights = height[:]
height = sum(heights) + gap * (len(images) - 1)
for im, w, h in zip(images, widths, heights):
im.thumbnail((w, h), PImage.ANTIALIAS)
widths, heights = zip(*(i.size for i in images))
max_width = max(widths)
total_height = sum(heights) + gap * (len(images) - 1)
new_im = PImage.new("RGBA", (max_width, total_height))
y_offset = 0
for im in images:
new_im.paste(im, (0, y_offset), mask=im)
y_offset += im.size[1] + gap
new_im.thumbnail((width, height), PImage.ANTIALIAS)
return new_im
[docs] def images_gridconcat(
pathslist, width=700, height=700, aspaths=True, hgap=0, vgap=0
):
"""concatenate multiple images in a grid
Parameters
----------
pathslist : list[list]
if aspaths=True, list of path strings, else list of PIL.Image instances
each sub list constitutes a row
width : int
maximum width of final image
height : int
maximum height of final image
hgap : int
size of horizontal space between images
vgap : int
size of vertical space between images
Returns
-------
image : PIL.Image
"""
himages = [
images_hconcat(paths, gap=hgap, aspaths=aspaths) for paths in pathslist
]
new_im = images_vconcat(himages, gap=vgap, aspaths=False)
new_im.thumbnail((width, height), PImage.ANTIALIAS)
return new_im
# JSONEXTENDED
# ==========================
try:
from jsonextended import ejson, edict
_jsonextended_present = True
except ImportError:
_jsonextended_present = False
if _jsonextended_present:
from jsonextended import plugins as eplugins
# eplugins.load_builtin_plugins()