Interactive masking#

In this example, we will use a custom drawing tool to draw rectangles on a 2D figure. The data inside the rectangles will be masked.

[1]:
%matplotlib widget
import plopp as pp
import scipp as sc
import numpy as np

We first generate some data that contains three bands of peaks that all have different spreads.

[2]:
from plopp.data.examples import three_bands

da = three_bands()

We then construct our custom tool, using Mpltoolbox’s Rectangles tool, and inheriting from Plopp’s DrawingTool.

[3]:
from plopp.widgets.drawing import DrawingTool
from functools import partial
from mpltoolbox import Rectangles


def define_mask(da, rect_info):
    """
    Function that creates a mask inside the area
    covered by the rectangle.
    """
    x = rect_info['x']
    y = rect_info['y']
    b = min(y['bottom'], y['top'])
    t = max(y['bottom'], y['top'])
    l = min(x['left'], x['right'])
    r = max(x['left'], x['right'])

    xcoord = sc.midpoints(da.coords[x['dim']])
    ycoord = sc.midpoints(da.coords[y['dim']])
    return (xcoord >= l) & (xcoord <= r) & (ycoord >= b) & (ycoord <= t)


def _get_rect_info(artist, figure):
    """
    Convert the raw rectangle info to a dict containing the dimensions of
    each axis, and values with units.
    """
    return lambda: {
        'x': {
            'dim': figure.canvas.dims['x'],
            'left': sc.scalar(artist.xy[0], unit=figure.canvas.units['x']),
            'right': sc.scalar(
                artist.xy[0] + artist.width, unit=figure.canvas.units['x']
            ),
        },
        'y': {
            'dim': figure.canvas.dims['y'],
            'bottom': sc.scalar(artist.xy[1], unit=figure.canvas.units['y']),
            'top': sc.scalar(
                artist.xy[1] + artist.height, unit=figure.canvas.units['y']
            ),
        },
    }


RectangleTool = partial(
    DrawingTool, tool=Rectangles, get_artist_info=_get_rect_info, icon='vector-square'
)

Finally, we create our visualization interface with the figure, adding our new tool to the toolbar.

[4]:
from plopp.widgets import Box

data_node = pp.Node(da)


def apply_masks(da, *masks):
    out = da.copy(deep=False)
    for i, mask in enumerate(masks):
        out.masks[str(i)] = mask
    return out


masking_node = pp.Node(apply_masks, data_node)

fig = pp.imagefigure(masking_node, norm='log')

r = RectangleTool(
    figure=fig, input_node=data_node, func=define_mask, destination=masking_node
)
fig.toolbar['roi'] = r
[6]:
fig
[6]:
[7]:
pp.show_graph(fig)
[7]:
../_images/gallery_interactive-masking_10_0.svg

To retrieve the masked data array, simply call the node that is applying the masks:

[8]:
masking_node()
[8]:
Show/Hide data repr Show/Hide attributes
scipp.DataArray (885.36 KB)
    • y: 300
    • x: 300
    • x
      (x [bin-edge])
      float64
      cm
      -73.519, -71.957, ..., 393.563, 395.125
      Values:
      array([-7.35186689e+01, -7.19565217e+01, -7.03943746e+01, -6.88322275e+01, -6.72700803e+01, -6.57079332e+01, -6.41457860e+01, -6.25836389e+01, -6.10214918e+01, -5.94593446e+01, -5.78971975e+01, -5.63350503e+01, -5.47729032e+01, -5.32107561e+01, -5.16486089e+01, -5.00864618e+01, -4.85243147e+01, -4.69621675e+01, -4.54000204e+01, -4.38378732e+01, -4.22757261e+01, -4.07135790e+01, -3.91514318e+01, -3.75892847e+01, -3.60271376e+01, -3.44649904e+01, -3.29028433e+01, -3.13406961e+01, -2.97785490e+01, -2.82164019e+01, -2.66542547e+01, -2.50921076e+01, -2.35299604e+01, -2.19678133e+01, -2.04056662e+01, -1.88435190e+01, -1.72813719e+01, -1.57192248e+01, -1.41570776e+01, -1.25949305e+01, -1.10327833e+01, -9.47063621e+00, -7.90848907e+00, -6.34634193e+00, -4.78419479e+00, -3.22204766e+00, -1.65990052e+00, -9.77533801e-02, 1.46439376e+00, 3.02654090e+00, 4.58868803e+00, 6.15083517e+00, 7.71298231e+00, 9.27512945e+00, 1.08372766e+01, 1.23994237e+01, 1.39615709e+01, 1.55237180e+01, 1.70858651e+01, 1.86480123e+01, 2.02101594e+01, 2.17723066e+01, 2.33344537e+01, 2.48966008e+01, 2.64587480e+01, 2.80208951e+01, 2.95830422e+01, 3.11451894e+01, 3.27073365e+01, 3.42694837e+01, 3.58316308e+01, 3.73937779e+01, 3.89559251e+01, 4.05180722e+01, 4.20802193e+01, 4.36423665e+01, 4.52045136e+01, 4.67666608e+01, 4.83288079e+01, 4.98909550e+01, 5.14531022e+01, 5.30152493e+01, 5.45773964e+01, 5.61395436e+01, 5.77016907e+01, 5.92638379e+01, 6.08259850e+01, 6.23881321e+01, 6.39502793e+01, 6.55124264e+01, 6.70745736e+01, 6.86367207e+01, 7.01988678e+01, 7.17610150e+01, 7.33231621e+01, 7.48853092e+01, 7.64474564e+01, 7.80096035e+01, 7.95717507e+01, 8.11338978e+01, 8.26960449e+01, 8.42581921e+01, 8.58203392e+01, 8.73824863e+01, 8.89446335e+01, 9.05067806e+01, 9.20689278e+01, 9.36310749e+01, 9.51932220e+01, 9.67553692e+01, 9.83175163e+01, 9.98796635e+01, 1.01441811e+02, 1.03003958e+02, 1.04566105e+02, 1.06128252e+02, 1.07690399e+02, 1.09252546e+02, 1.10814693e+02, 1.12376841e+02, 1.13938988e+02, 1.15501135e+02, 1.17063282e+02, 1.18625429e+02, 1.20187576e+02, 1.21749723e+02, 1.23311871e+02, 1.24874018e+02, 1.26436165e+02, 1.27998312e+02, 1.29560459e+02, 1.31122606e+02, 1.32684753e+02, 1.34246900e+02, 1.35809048e+02, 1.37371195e+02, 1.38933342e+02, 1.40495489e+02, 1.42057636e+02, 1.43619783e+02, 1.45181930e+02, 1.46744078e+02, 1.48306225e+02, 1.49868372e+02, 1.51430519e+02, 1.52992666e+02, 1.54554813e+02, 1.56116960e+02, 1.57679108e+02, 1.59241255e+02, 1.60803402e+02, 1.62365549e+02, 1.63927696e+02, 1.65489843e+02, 1.67051990e+02, 1.68614138e+02, 1.70176285e+02, 1.71738432e+02, 1.73300579e+02, 1.74862726e+02, 1.76424873e+02, 1.77987020e+02, 1.79549167e+02, 1.81111315e+02, 1.82673462e+02, 1.84235609e+02, 1.85797756e+02, 1.87359903e+02, 1.88922050e+02, 1.90484197e+02, 1.92046345e+02, 1.93608492e+02, 1.95170639e+02, 1.96732786e+02, 1.98294933e+02, 1.99857080e+02, 2.01419227e+02, 2.02981375e+02, 2.04543522e+02, 2.06105669e+02, 2.07667816e+02, 2.09229963e+02, 2.10792110e+02, 2.12354257e+02, 2.13916405e+02, 2.15478552e+02, 2.17040699e+02, 2.18602846e+02, 2.20164993e+02, 2.21727140e+02, 2.23289287e+02, 2.24851434e+02, 2.26413582e+02, 2.27975729e+02, 2.29537876e+02, 2.31100023e+02, 2.32662170e+02, 2.34224317e+02, 2.35786464e+02, 2.37348612e+02, 2.38910759e+02, 2.40472906e+02, 2.42035053e+02, 2.43597200e+02, 2.45159347e+02, 2.46721494e+02, 2.48283642e+02, 2.49845789e+02, 2.51407936e+02, 2.52970083e+02, 2.54532230e+02, 2.56094377e+02, 2.57656524e+02, 2.59218672e+02, 2.60780819e+02, 2.62342966e+02, 2.63905113e+02, 2.65467260e+02, 2.67029407e+02, 2.68591554e+02, 2.70153701e+02, 2.71715849e+02, 2.73277996e+02, 2.74840143e+02, 2.76402290e+02, 2.77964437e+02, 2.79526584e+02, 2.81088731e+02, 2.82650879e+02, 2.84213026e+02, 2.85775173e+02, 2.87337320e+02, 2.88899467e+02, 2.90461614e+02, 2.92023761e+02, 2.93585909e+02, 2.95148056e+02, 2.96710203e+02, 2.98272350e+02, 2.99834497e+02, 3.01396644e+02, 3.02958791e+02, 3.04520939e+02, 3.06083086e+02, 3.07645233e+02, 3.09207380e+02, 3.10769527e+02, 3.12331674e+02, 3.13893821e+02, 3.15455968e+02, 3.17018116e+02, 3.18580263e+02, 3.20142410e+02, 3.21704557e+02, 3.23266704e+02, 3.24828851e+02, 3.26390998e+02, 3.27953146e+02, 3.29515293e+02, 3.31077440e+02, 3.32639587e+02, 3.34201734e+02, 3.35763881e+02, 3.37326028e+02, 3.38888176e+02, 3.40450323e+02, 3.42012470e+02, 3.43574617e+02, 3.45136764e+02, 3.46698911e+02, 3.48261058e+02, 3.49823206e+02, 3.51385353e+02, 3.52947500e+02, 3.54509647e+02, 3.56071794e+02, 3.57633941e+02, 3.59196088e+02, 3.60758235e+02, 3.62320383e+02, 3.63882530e+02, 3.65444677e+02, 3.67006824e+02, 3.68568971e+02, 3.70131118e+02, 3.71693265e+02, 3.73255413e+02, 3.74817560e+02, 3.76379707e+02, 3.77941854e+02, 3.79504001e+02, 3.81066148e+02, 3.82628295e+02, 3.84190443e+02, 3.85752590e+02, 3.87314737e+02, 3.88876884e+02, 3.90439031e+02, 3.92001178e+02, 3.93563325e+02, 3.95125473e+02])
    • y
      (y [bin-edge])
      float64
      cm
      -13.936, -12.777, ..., 332.403, 333.561
      Values:
      array([-1.39356884e+01, -1.27773665e+01, -1.16190445e+01, -1.04607226e+01, -9.30240066e+00, -8.14407872e+00, -6.98575678e+00, -5.82743484e+00, -4.66911290e+00, -3.51079096e+00, -2.35246902e+00, -1.19414708e+00, -3.58251387e-02, 1.12249680e+00, 2.28081874e+00, 3.43914068e+00, 4.59746262e+00, 5.75578456e+00, 6.91410651e+00, 8.07242845e+00, 9.23075039e+00, 1.03890723e+01, 1.15473943e+01, 1.27057162e+01, 1.38640382e+01, 1.50223601e+01, 1.61806820e+01, 1.73390040e+01, 1.84973259e+01, 1.96556479e+01, 2.08139698e+01, 2.19722917e+01, 2.31306137e+01, 2.42889356e+01, 2.54472576e+01, 2.66055795e+01, 2.77639014e+01, 2.89222234e+01, 3.00805453e+01, 3.12388673e+01, 3.23971892e+01, 3.35555111e+01, 3.47138331e+01, 3.58721550e+01, 3.70304770e+01, 3.81887989e+01, 3.93471208e+01, 4.05054428e+01, 4.16637647e+01, 4.28220867e+01, 4.39804086e+01, 4.51387305e+01, 4.62970525e+01, 4.74553744e+01, 4.86136964e+01, 4.97720183e+01, 5.09303403e+01, 5.20886622e+01, 5.32469841e+01, 5.44053061e+01, 5.55636280e+01, 5.67219500e+01, 5.78802719e+01, 5.90385938e+01, 6.01969158e+01, 6.13552377e+01, 6.25135597e+01, 6.36718816e+01, 6.48302035e+01, 6.59885255e+01, 6.71468474e+01, 6.83051694e+01, 6.94634913e+01, 7.06218132e+01, 7.17801352e+01, 7.29384571e+01, 7.40967791e+01, 7.52551010e+01, 7.64134229e+01, 7.75717449e+01, 7.87300668e+01, 7.98883888e+01, 8.10467107e+01, 8.22050327e+01, 8.33633546e+01, 8.45216765e+01, 8.56799985e+01, 8.68383204e+01, 8.79966424e+01, 8.91549643e+01, 9.03132862e+01, 9.14716082e+01, 9.26299301e+01, 9.37882521e+01, 9.49465740e+01, 9.61048959e+01, 9.72632179e+01, 9.84215398e+01, 9.95798618e+01, 1.00738184e+02, 1.01896506e+02, 1.03054828e+02, 1.04213150e+02, 1.05371471e+02, 1.06529793e+02, 1.07688115e+02, 1.08846437e+02, 1.10004759e+02, 1.11163081e+02, 1.12321403e+02, 1.13479725e+02, 1.14638047e+02, 1.15796369e+02, 1.16954691e+02, 1.18113013e+02, 1.19271335e+02, 1.20429657e+02, 1.21587979e+02, 1.22746301e+02, 1.23904623e+02, 1.25062944e+02, 1.26221266e+02, 1.27379588e+02, 1.28537910e+02, 1.29696232e+02, 1.30854554e+02, 1.32012876e+02, 1.33171198e+02, 1.34329520e+02, 1.35487842e+02, 1.36646164e+02, 1.37804486e+02, 1.38962808e+02, 1.40121130e+02, 1.41279452e+02, 1.42437774e+02, 1.43596096e+02, 1.44754417e+02, 1.45912739e+02, 1.47071061e+02, 1.48229383e+02, 1.49387705e+02, 1.50546027e+02, 1.51704349e+02, 1.52862671e+02, 1.54020993e+02, 1.55179315e+02, 1.56337637e+02, 1.57495959e+02, 1.58654281e+02, 1.59812603e+02, 1.60970925e+02, 1.62129247e+02, 1.63287569e+02, 1.64445890e+02, 1.65604212e+02, 1.66762534e+02, 1.67920856e+02, 1.69079178e+02, 1.70237500e+02, 1.71395822e+02, 1.72554144e+02, 1.73712466e+02, 1.74870788e+02, 1.76029110e+02, 1.77187432e+02, 1.78345754e+02, 1.79504076e+02, 1.80662398e+02, 1.81820720e+02, 1.82979041e+02, 1.84137363e+02, 1.85295685e+02, 1.86454007e+02, 1.87612329e+02, 1.88770651e+02, 1.89928973e+02, 1.91087295e+02, 1.92245617e+02, 1.93403939e+02, 1.94562261e+02, 1.95720583e+02, 1.96878905e+02, 1.98037227e+02, 1.99195549e+02, 2.00353871e+02, 2.01512193e+02, 2.02670514e+02, 2.03828836e+02, 2.04987158e+02, 2.06145480e+02, 2.07303802e+02, 2.08462124e+02, 2.09620446e+02, 2.10778768e+02, 2.11937090e+02, 2.13095412e+02, 2.14253734e+02, 2.15412056e+02, 2.16570378e+02, 2.17728700e+02, 2.18887022e+02, 2.20045344e+02, 2.21203666e+02, 2.22361987e+02, 2.23520309e+02, 2.24678631e+02, 2.25836953e+02, 2.26995275e+02, 2.28153597e+02, 2.29311919e+02, 2.30470241e+02, 2.31628563e+02, 2.32786885e+02, 2.33945207e+02, 2.35103529e+02, 2.36261851e+02, 2.37420173e+02, 2.38578495e+02, 2.39736817e+02, 2.40895139e+02, 2.42053460e+02, 2.43211782e+02, 2.44370104e+02, 2.45528426e+02, 2.46686748e+02, 2.47845070e+02, 2.49003392e+02, 2.50161714e+02, 2.51320036e+02, 2.52478358e+02, 2.53636680e+02, 2.54795002e+02, 2.55953324e+02, 2.57111646e+02, 2.58269968e+02, 2.59428290e+02, 2.60586612e+02, 2.61744933e+02, 2.62903255e+02, 2.64061577e+02, 2.65219899e+02, 2.66378221e+02, 2.67536543e+02, 2.68694865e+02, 2.69853187e+02, 2.71011509e+02, 2.72169831e+02, 2.73328153e+02, 2.74486475e+02, 2.75644797e+02, 2.76803119e+02, 2.77961441e+02, 2.79119763e+02, 2.80278085e+02, 2.81436406e+02, 2.82594728e+02, 2.83753050e+02, 2.84911372e+02, 2.86069694e+02, 2.87228016e+02, 2.88386338e+02, 2.89544660e+02, 2.90702982e+02, 2.91861304e+02, 2.93019626e+02, 2.94177948e+02, 2.95336270e+02, 2.96494592e+02, 2.97652914e+02, 2.98811236e+02, 2.99969558e+02, 3.01127879e+02, 3.02286201e+02, 3.03444523e+02, 3.04602845e+02, 3.05761167e+02, 3.06919489e+02, 3.08077811e+02, 3.09236133e+02, 3.10394455e+02, 3.11552777e+02, 3.12711099e+02, 3.13869421e+02, 3.15027743e+02, 3.16186065e+02, 3.17344387e+02, 3.18502709e+02, 3.19661031e+02, 3.20819352e+02, 3.21977674e+02, 3.23135996e+02, 3.24294318e+02, 3.25452640e+02, 3.26610962e+02, 3.27769284e+02, 3.28927606e+02, 3.30085928e+02, 3.31244250e+02, 3.32402572e+02, 3.33560894e+02])
    • (y, x)
      float64
      counts
      1.0, 1.0, ..., 1.0, 1.0
      Values:
      array([[1., 1., 1., ..., 1., 1., 1.], [1., 1., 1., ..., 1., 1., 1.], [1., 1., 1., ..., 1., 1., 1.], ..., [1., 1., 1., ..., 1., 1., 1.], [1., 1., 1., ..., 1., 1., 1.], [1., 1., 1., ..., 1., 1., 1.]])
    • 0
      (x, y)
      bool
      False, False, ..., False, False
      Values:
      array([[False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], ..., [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False]])
    • 1
      (x, y)
      bool
      False, False, ..., False, False
      Values:
      array([[False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], ..., [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False]])