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

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]:
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.21 KB)
    • y: 300
    • x: 300
    • x
      (x [bin-edge])
      float64
      cm
      -72.578, -71.123, ..., 362.576, 364.032
      Values:
      array([-7.25782097e+01, -7.11228432e+01, -6.96674766e+01, -6.82121101e+01, -6.67567435e+01, -6.53013770e+01, -6.38460105e+01, -6.23906439e+01, -6.09352774e+01, -5.94799108e+01, -5.80245443e+01, -5.65691777e+01, -5.51138112e+01, -5.36584446e+01, -5.22030781e+01, -5.07477115e+01, -4.92923450e+01, -4.78369785e+01, -4.63816119e+01, -4.49262454e+01, -4.34708788e+01, -4.20155123e+01, -4.05601457e+01, -3.91047792e+01, -3.76494126e+01, -3.61940461e+01, -3.47386796e+01, -3.32833130e+01, -3.18279465e+01, -3.03725799e+01, -2.89172134e+01, -2.74618468e+01, -2.60064803e+01, -2.45511137e+01, -2.30957472e+01, -2.16403807e+01, -2.01850141e+01, -1.87296476e+01, -1.72742810e+01, -1.58189145e+01, -1.43635479e+01, -1.29081814e+01, -1.14528148e+01, -9.99744830e+00, -8.54208176e+00, -7.08671521e+00, -5.63134867e+00, -4.17598212e+00, -2.72061558e+00, -1.26524903e+00, 1.90117513e-01, 1.64548406e+00, 3.10085060e+00, 4.55621715e+00, 6.01158369e+00, 7.46695024e+00, 8.92231678e+00, 1.03776833e+01, 1.18330499e+01, 1.32884164e+01, 1.47437830e+01, 1.61991495e+01, 1.76545160e+01, 1.91098826e+01, 2.05652491e+01, 2.20206157e+01, 2.34759822e+01, 2.49313488e+01, 2.63867153e+01, 2.78420819e+01, 2.92974484e+01, 3.07528150e+01, 3.22081815e+01, 3.36635480e+01, 3.51189146e+01, 3.65742811e+01, 3.80296477e+01, 3.94850142e+01, 4.09403808e+01, 4.23957473e+01, 4.38511139e+01, 4.53064804e+01, 4.67618469e+01, 4.82172135e+01, 4.96725800e+01, 5.11279466e+01, 5.25833131e+01, 5.40386797e+01, 5.54940462e+01, 5.69494128e+01, 5.84047793e+01, 5.98601458e+01, 6.13155124e+01, 6.27708789e+01, 6.42262455e+01, 6.56816120e+01, 6.71369786e+01, 6.85923451e+01, 7.00477117e+01, 7.15030782e+01, 7.29584447e+01, 7.44138113e+01, 7.58691778e+01, 7.73245444e+01, 7.87799109e+01, 8.02352775e+01, 8.16906440e+01, 8.31460106e+01, 8.46013771e+01, 8.60567436e+01, 8.75121102e+01, 8.89674767e+01, 9.04228433e+01, 9.18782098e+01, 9.33335764e+01, 9.47889429e+01, 9.62443095e+01, 9.76996760e+01, 9.91550425e+01, 1.00610409e+02, 1.02065776e+02, 1.03521142e+02, 1.04976509e+02, 1.06431875e+02, 1.07887242e+02, 1.09342608e+02, 1.10797975e+02, 1.12253341e+02, 1.13708708e+02, 1.15164075e+02, 1.16619441e+02, 1.18074808e+02, 1.19530174e+02, 1.20985541e+02, 1.22440907e+02, 1.23896274e+02, 1.25351640e+02, 1.26807007e+02, 1.28262373e+02, 1.29717740e+02, 1.31173107e+02, 1.32628473e+02, 1.34083840e+02, 1.35539206e+02, 1.36994573e+02, 1.38449939e+02, 1.39905306e+02, 1.41360672e+02, 1.42816039e+02, 1.44271405e+02, 1.45726772e+02, 1.47182139e+02, 1.48637505e+02, 1.50092872e+02, 1.51548238e+02, 1.53003605e+02, 1.54458971e+02, 1.55914338e+02, 1.57369704e+02, 1.58825071e+02, 1.60280437e+02, 1.61735804e+02, 1.63191171e+02, 1.64646537e+02, 1.66101904e+02, 1.67557270e+02, 1.69012637e+02, 1.70468003e+02, 1.71923370e+02, 1.73378736e+02, 1.74834103e+02, 1.76289469e+02, 1.77744836e+02, 1.79200203e+02, 1.80655569e+02, 1.82110936e+02, 1.83566302e+02, 1.85021669e+02, 1.86477035e+02, 1.87932402e+02, 1.89387768e+02, 1.90843135e+02, 1.92298501e+02, 1.93753868e+02, 1.95209234e+02, 1.96664601e+02, 1.98119968e+02, 1.99575334e+02, 2.01030701e+02, 2.02486067e+02, 2.03941434e+02, 2.05396800e+02, 2.06852167e+02, 2.08307533e+02, 2.09762900e+02, 2.11218266e+02, 2.12673633e+02, 2.14129000e+02, 2.15584366e+02, 2.17039733e+02, 2.18495099e+02, 2.19950466e+02, 2.21405832e+02, 2.22861199e+02, 2.24316565e+02, 2.25771932e+02, 2.27227298e+02, 2.28682665e+02, 2.30138032e+02, 2.31593398e+02, 2.33048765e+02, 2.34504131e+02, 2.35959498e+02, 2.37414864e+02, 2.38870231e+02, 2.40325597e+02, 2.41780964e+02, 2.43236330e+02, 2.44691697e+02, 2.46147064e+02, 2.47602430e+02, 2.49057797e+02, 2.50513163e+02, 2.51968530e+02, 2.53423896e+02, 2.54879263e+02, 2.56334629e+02, 2.57789996e+02, 2.59245362e+02, 2.60700729e+02, 2.62156096e+02, 2.63611462e+02, 2.65066829e+02, 2.66522195e+02, 2.67977562e+02, 2.69432928e+02, 2.70888295e+02, 2.72343661e+02, 2.73799028e+02, 2.75254394e+02, 2.76709761e+02, 2.78165128e+02, 2.79620494e+02, 2.81075861e+02, 2.82531227e+02, 2.83986594e+02, 2.85441960e+02, 2.86897327e+02, 2.88352693e+02, 2.89808060e+02, 2.91263426e+02, 2.92718793e+02, 2.94174160e+02, 2.95629526e+02, 2.97084893e+02, 2.98540259e+02, 2.99995626e+02, 3.01450992e+02, 3.02906359e+02, 3.04361725e+02, 3.05817092e+02, 3.07272458e+02, 3.08727825e+02, 3.10183192e+02, 3.11638558e+02, 3.13093925e+02, 3.14549291e+02, 3.16004658e+02, 3.17460024e+02, 3.18915391e+02, 3.20370757e+02, 3.21826124e+02, 3.23281490e+02, 3.24736857e+02, 3.26192224e+02, 3.27647590e+02, 3.29102957e+02, 3.30558323e+02, 3.32013690e+02, 3.33469056e+02, 3.34924423e+02, 3.36379789e+02, 3.37835156e+02, 3.39290522e+02, 3.40745889e+02, 3.42201256e+02, 3.43656622e+02, 3.45111989e+02, 3.46567355e+02, 3.48022722e+02, 3.49478088e+02, 3.50933455e+02, 3.52388821e+02, 3.53844188e+02, 3.55299554e+02, 3.56754921e+02, 3.58210287e+02, 3.59665654e+02, 3.61121021e+02, 3.62576387e+02, 3.64031754e+02])
    • y
      (y [bin-edge])
      float64
      cm
      -16.299, -15.150, ..., 327.221, 328.370
      Values:
      array([-1.62987394e+01, -1.51498436e+01, -1.40009477e+01, -1.28520519e+01, -1.17031560e+01, -1.05542602e+01, -9.40536434e+00, -8.25646848e+00, -7.10757263e+00, -5.95867678e+00, -4.80978093e+00, -3.66088508e+00, -2.51198923e+00, -1.36309337e+00, -2.14197522e-01, 9.34698330e-01, 2.08359418e+00, 3.23249003e+00, 4.38138589e+00, 5.53028174e+00, 6.67917759e+00, 7.82807344e+00, 8.97696929e+00, 1.01258651e+01, 1.12747610e+01, 1.24236568e+01, 1.35725527e+01, 1.47214486e+01, 1.58703444e+01, 1.70192403e+01, 1.81681361e+01, 1.93170320e+01, 2.04659278e+01, 2.16148237e+01, 2.27637195e+01, 2.39126154e+01, 2.50615112e+01, 2.62104071e+01, 2.73593029e+01, 2.85081988e+01, 2.96570946e+01, 3.08059905e+01, 3.19548863e+01, 3.31037822e+01, 3.42526780e+01, 3.54015739e+01, 3.65504697e+01, 3.76993656e+01, 3.88482614e+01, 3.99971573e+01, 4.11460531e+01, 4.22949490e+01, 4.34438448e+01, 4.45927407e+01, 4.57416365e+01, 4.68905324e+01, 4.80394282e+01, 4.91883241e+01, 5.03372200e+01, 5.14861158e+01, 5.26350117e+01, 5.37839075e+01, 5.49328034e+01, 5.60816992e+01, 5.72305951e+01, 5.83794909e+01, 5.95283868e+01, 6.06772826e+01, 6.18261785e+01, 6.29750743e+01, 6.41239702e+01, 6.52728660e+01, 6.64217619e+01, 6.75706577e+01, 6.87195536e+01, 6.98684494e+01, 7.10173453e+01, 7.21662411e+01, 7.33151370e+01, 7.44640328e+01, 7.56129287e+01, 7.67618245e+01, 7.79107204e+01, 7.90596162e+01, 8.02085121e+01, 8.13574079e+01, 8.25063038e+01, 8.36551997e+01, 8.48040955e+01, 8.59529914e+01, 8.71018872e+01, 8.82507831e+01, 8.93996789e+01, 9.05485748e+01, 9.16974706e+01, 9.28463665e+01, 9.39952623e+01, 9.51441582e+01, 9.62930540e+01, 9.74419499e+01, 9.85908457e+01, 9.97397416e+01, 1.00888637e+02, 1.02037533e+02, 1.03186429e+02, 1.04335325e+02, 1.05484221e+02, 1.06633117e+02, 1.07782013e+02, 1.08930908e+02, 1.10079804e+02, 1.11228700e+02, 1.12377596e+02, 1.13526492e+02, 1.14675388e+02, 1.15824283e+02, 1.16973179e+02, 1.18122075e+02, 1.19270971e+02, 1.20419867e+02, 1.21568763e+02, 1.22717659e+02, 1.23866554e+02, 1.25015450e+02, 1.26164346e+02, 1.27313242e+02, 1.28462138e+02, 1.29611034e+02, 1.30759930e+02, 1.31908825e+02, 1.33057721e+02, 1.34206617e+02, 1.35355513e+02, 1.36504409e+02, 1.37653305e+02, 1.38802201e+02, 1.39951096e+02, 1.41099992e+02, 1.42248888e+02, 1.43397784e+02, 1.44546680e+02, 1.45695576e+02, 1.46844471e+02, 1.47993367e+02, 1.49142263e+02, 1.50291159e+02, 1.51440055e+02, 1.52588951e+02, 1.53737847e+02, 1.54886742e+02, 1.56035638e+02, 1.57184534e+02, 1.58333430e+02, 1.59482326e+02, 1.60631222e+02, 1.61780118e+02, 1.62929013e+02, 1.64077909e+02, 1.65226805e+02, 1.66375701e+02, 1.67524597e+02, 1.68673493e+02, 1.69822389e+02, 1.70971284e+02, 1.72120180e+02, 1.73269076e+02, 1.74417972e+02, 1.75566868e+02, 1.76715764e+02, 1.77864659e+02, 1.79013555e+02, 1.80162451e+02, 1.81311347e+02, 1.82460243e+02, 1.83609139e+02, 1.84758035e+02, 1.85906930e+02, 1.87055826e+02, 1.88204722e+02, 1.89353618e+02, 1.90502514e+02, 1.91651410e+02, 1.92800306e+02, 1.93949201e+02, 1.95098097e+02, 1.96246993e+02, 1.97395889e+02, 1.98544785e+02, 1.99693681e+02, 2.00842577e+02, 2.01991472e+02, 2.03140368e+02, 2.04289264e+02, 2.05438160e+02, 2.06587056e+02, 2.07735952e+02, 2.08884847e+02, 2.10033743e+02, 2.11182639e+02, 2.12331535e+02, 2.13480431e+02, 2.14629327e+02, 2.15778223e+02, 2.16927118e+02, 2.18076014e+02, 2.19224910e+02, 2.20373806e+02, 2.21522702e+02, 2.22671598e+02, 2.23820494e+02, 2.24969389e+02, 2.26118285e+02, 2.27267181e+02, 2.28416077e+02, 2.29564973e+02, 2.30713869e+02, 2.31862765e+02, 2.33011660e+02, 2.34160556e+02, 2.35309452e+02, 2.36458348e+02, 2.37607244e+02, 2.38756140e+02, 2.39905035e+02, 2.41053931e+02, 2.42202827e+02, 2.43351723e+02, 2.44500619e+02, 2.45649515e+02, 2.46798411e+02, 2.47947306e+02, 2.49096202e+02, 2.50245098e+02, 2.51393994e+02, 2.52542890e+02, 2.53691786e+02, 2.54840682e+02, 2.55989577e+02, 2.57138473e+02, 2.58287369e+02, 2.59436265e+02, 2.60585161e+02, 2.61734057e+02, 2.62882953e+02, 2.64031848e+02, 2.65180744e+02, 2.66329640e+02, 2.67478536e+02, 2.68627432e+02, 2.69776328e+02, 2.70925223e+02, 2.72074119e+02, 2.73223015e+02, 2.74371911e+02, 2.75520807e+02, 2.76669703e+02, 2.77818599e+02, 2.78967494e+02, 2.80116390e+02, 2.81265286e+02, 2.82414182e+02, 2.83563078e+02, 2.84711974e+02, 2.85860870e+02, 2.87009765e+02, 2.88158661e+02, 2.89307557e+02, 2.90456453e+02, 2.91605349e+02, 2.92754245e+02, 2.93903141e+02, 2.95052036e+02, 2.96200932e+02, 2.97349828e+02, 2.98498724e+02, 2.99647620e+02, 3.00796516e+02, 3.01945411e+02, 3.03094307e+02, 3.04243203e+02, 3.05392099e+02, 3.06540995e+02, 3.07689891e+02, 3.08838787e+02, 3.09987682e+02, 3.11136578e+02, 3.12285474e+02, 3.13434370e+02, 3.14583266e+02, 3.15732162e+02, 3.16881058e+02, 3.18029953e+02, 3.19178849e+02, 3.20327745e+02, 3.21476641e+02, 3.22625537e+02, 3.23774433e+02, 3.24923329e+02, 3.26072224e+02, 3.27221120e+02, 3.28370016e+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.]], shape=(300, 300))
    • 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]], shape=(300, 300))
    • 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]], shape=(300, 300))