prep_for_imshow#

This function returns a dictionary that can be passed to matplotlib’s imshow function, with all the necessary keyword arguments holding values to make the output look nice.

import matplotlib.pyplot as plt
import porespy as ps
import numpy as np
from edt import edt
from copy import copy
ps.visualization.set_mpl_style()
[01:59:31] ERROR    PARDISO solver not installed, run `pip install pypardiso`. Otherwise,          _workspace.py:56
                    simulations will be slow. Apple M chips not supported.                                         
import inspect
inspect.signature(ps.visualization.prep_for_imshow)
<Signature (im, mask=None, axis=0, slice=None)>
im = ps.generators.blobs([50, 50, 50], porosity=0.6)
dt = edt(im)

im#

The im is usually greyscale values, but boolean also works.

kw = ps.visualization.prep_for_imshow(im=dt, mask=im)
plt.imshow(**kw);
../../../_images/852f9da5e58c4634e79e61d1438b97bed988984a194be70c188af401f3cc1a6e.png

The returned dict is passable to imshow as keyword arguments, with all the useful values set

print(kw.keys())
dict_keys(['X', 'vmin', 'vmax', 'interpolation', 'origin'])
  • X is the array to show. The im was 3D, but the function extracts a 2D slice which is necessary for imshow.

  • vmin and vmax are minimum and maximum values in im, while any negative and positive infinities are set to vmin - 1 and vmax - 1 respectively. You can adjust adjust a colormap to show suitable colors for over and under values.

  • interpolation is set to none which prevents artifacts, especially in boolean images.

  • origin is set to lower so that [0, 0] is in the bottom-left where it belongs.

We can show the solid phase as grey, and also use the plasma colormap:

kw = ps.visualization.prep_for_imshow(im=dt, mask=im)
cmap = copy(plt.cm.plasma)
cmap.set_under('grey')
plt.imshow(**kw, cmap=cmap);
../../../_images/bd61055a7e43a16b86916ffd17e5a7068d3f71617e76d73c32105fc9182c753d.png

mask#

The mask is a boolean array indicating the voxels of interest when computing vmin and vmax. This would typically be the image of the pore phase, but could be something more creative:

mask = im * (dt < 3)
kw = ps.visualization.prep_for_imshow(im=dt, mask=mask)
cmap = copy(plt.cm.plasma)
cmap.set_under('grey')
cmap.set_over('green')
plt.imshow(**kw, cmap=cmap);
../../../_images/6800c680641fa6e2e8ca22671c49ee6559764239ce694a359944b86303af9582.png

axis#

The direction normal to which the slice should be taken. The default is 0, which means a y-z slice looking in the x direction.

kw1 = ps.visualization.prep_for_imshow(im=dt, mask=im, axis=1)
kw2 = ps.visualization.prep_for_imshow(im=dt, mask=im, axis=2)

cmap = copy(plt.cm.plasma)
cmap.set_under('grey')
fig, ax = plt.subplots(1, 2, figsize=[12, 6])
ax[0].imshow(**kw1, cmap=cmap)
ax[1].imshow(**kw2, cmap=cmap);
../../../_images/819ff90bbb8475898e42a5be4bb8e7da100d4a74c5d49f258a384b9607bb8e96.png

slice#

The postion along axis where the 2D section should be taken from. If not provided (and the image is 3D) then a slice is taken from the midpoint of the given axis.

kw1 = ps.visualization.prep_for_imshow(im=dt, mask=im, slice=10)
kw2 = ps.visualization.prep_for_imshow(im=dt, mask=im, slice=20)

cmap = copy(plt.cm.plasma)
cmap.set_under('grey')
fig, ax = plt.subplots(1, 2, figsize=[12, 6])
ax[0].imshow(**kw1, cmap=cmap)
ax[1].imshow(**kw2, cmap=cmap);
../../../_images/bf20f3d2c3372af6db10b2c62bd0de97f72d333c78aaa766a7ef352c851e6a60.png