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
      -89.070, -87.523, ..., 373.563, 375.110
      Values:
      array([-89.07007104, -87.52280457, -85.9755381 , -84.42827163, -82.88100515, -81.33373868, -79.78647221, -78.23920573, -76.69193926, -75.14467279, -73.59740632, -72.05013984, -70.50287337, -68.9556069 , -67.40834042, -65.86107395, -64.31380748, -62.766541 , -61.21927453, -59.67200806, -58.12474159, -56.57747511, -55.03020864, -53.48294217, -51.93567569, -50.38840922, -48.84114275, -47.29387628, -45.7466098 , -44.19934333, -42.65207686, -41.10481038, -39.55754391, -38.01027744, -36.46301096, -34.91574449, -33.36847802, -31.82121155, -30.27394507, -28.7266786 , -27.17941213, -25.63214565, -24.08487918, -22.53761271, -20.99034624, -19.44307976, -17.89581329, -16.34854682, -14.80128034, -13.25401387, -11.7067474 , -10.15948092, -8.61221445, -7.06494798, -5.51768151, -3.97041503, -2.42314856, -0.87588209, 0.67138439, 2.21865086, 3.76591733, 5.3131838 , 6.86045028, 8.40771675, 9.95498322, 11.5022497 , 13.04951617, 14.59678264, 16.14404912, 17.69131559, 19.23858206, 20.78584853, 22.33311501, 23.88038148, 25.42764795, 26.97491443, 28.5221809 , 30.06944737, 31.61671384, 33.16398032, 34.71124679, 36.25851326, 37.80577974, 39.35304621, 40.90031268, 42.44757916, 43.99484563, 45.5421121 , 47.08937857, 48.63664505, 50.18391152, 51.73117799, 53.27844447, 54.82571094, 56.37297741, 57.92024389, 59.46751036, 61.01477683, 62.5620433 , 64.10930978, 65.65657625, 67.20384272, 68.7511092 , 70.29837567, 71.84564214, 73.39290861, 74.94017509, 76.48744156, 78.03470803, 79.58197451, 81.12924098, 82.67650745, 84.22377393, 85.7710404 , 87.31830687, 88.86557334, 90.41283982, 91.96010629, 93.50737276, 95.05463924, 96.60190571, 98.14917218, 99.69643865, 101.24370513, 102.7909716 , 104.33823807, 105.88550455, 107.43277102, 108.98003749, 110.52730397, 112.07457044, 113.62183691, 115.16910338, 116.71636986, 118.26363633, 119.8109028 , 121.35816928, 122.90543575, 124.45270222, 125.99996869, 127.54723517, 129.09450164, 130.64176811, 132.18903459, 133.73630106, 135.28356753, 136.83083401, 138.37810048, 139.92536695, 141.47263342, 143.0198999 , 144.56716637, 146.11443284, 147.66169932, 149.20896579, 150.75623226, 152.30349873, 153.85076521, 155.39803168, 156.94529815, 158.49256463, 160.0398311 , 161.58709757, 163.13436405, 164.68163052, 166.22889699, 167.77616346, 169.32342994, 170.87069641, 172.41796288, 173.96522936, 175.51249583, 177.0597623 , 178.60702877, 180.15429525, 181.70156172, 183.24882819, 184.79609467, 186.34336114, 187.89062761, 189.43789409, 190.98516056, 192.53242703, 194.0796935 , 195.62695998, 197.17422645, 198.72149292, 200.2687594 , 201.81602587, 203.36329234, 204.91055881, 206.45782529, 208.00509176, 209.55235823, 211.09962471, 212.64689118, 214.19415765, 215.74142413, 217.2886906 , 218.83595707, 220.38322354, 221.93049002, 223.47775649, 225.02502296, 226.57228944, 228.11955591, 229.66682238, 231.21408885, 232.76135533, 234.3086218 , 235.85588827, 237.40315475, 238.95042122, 240.49768769, 242.04495417, 243.59222064, 245.13948711, 246.68675358, 248.23402006, 249.78128653, 251.328553 , 252.87581948, 254.42308595, 255.97035242, 257.51761889, 259.06488537, 260.61215184, 262.15941831, 263.70668479, 265.25395126, 266.80121773, 268.34848421, 269.89575068, 271.44301715, 272.99028362, 274.5375501 , 276.08481657, 277.63208304, 279.17934952, 280.72661599, 282.27388246, 283.82114893, 285.36841541, 286.91568188, 288.46294835, 290.01021483, 291.5574813 , 293.10474777, 294.65201425, 296.19928072, 297.74654719, 299.29381366, 300.84108014, 302.38834661, 303.93561308, 305.48287956, 307.03014603, 308.5774125 , 310.12467897, 311.67194545, 313.21921192, 314.76647839, 316.31374487, 317.86101134, 319.40827781, 320.95554429, 322.50281076, 324.05007723, 325.5973437 , 327.14461018, 328.69187665, 330.23914312, 331.7864096 , 333.33367607, 334.88094254, 336.42820901, 337.97547549, 339.52274196, 341.07000843, 342.61727491, 344.16454138, 345.71180785, 347.25907433, 348.8063408 , 350.35360727, 351.90087374, 353.44814022, 354.99540669, 356.54267316, 358.08993964, 359.63720611, 361.18447258, 362.73173905, 364.27900553, 365.826272 , 367.37353847, 368.92080495, 370.46807142, 372.01533789, 373.56260437, 375.10987084])
    • y
      (y [bin-edge])
      float64
      cm
      -25.027, -23.824, ..., 334.562, 335.764
      Values:
      array([-2.50269666e+01, -2.38243288e+01, -2.26216910e+01, -2.14190531e+01, -2.02164153e+01, -1.90137775e+01, -1.78111397e+01, -1.66085019e+01, -1.54058640e+01, -1.42032262e+01, -1.30005884e+01, -1.17979506e+01, -1.05953128e+01, -9.39267494e+00, -8.19003712e+00, -6.98739930e+00, -5.78476149e+00, -4.58212367e+00, -3.37948585e+00, -2.17684803e+00, -9.74210208e-01, 2.28427611e-01, 1.43106543e+00, 2.63370325e+00, 3.83634107e+00, 5.03897889e+00, 6.24161671e+00, 7.44425453e+00, 8.64689235e+00, 9.84953016e+00, 1.10521680e+01, 1.22548058e+01, 1.34574436e+01, 1.46600814e+01, 1.58627193e+01, 1.70653571e+01, 1.82679949e+01, 1.94706327e+01, 2.06732705e+01, 2.18759084e+01, 2.30785462e+01, 2.42811840e+01, 2.54838218e+01, 2.66864596e+01, 2.78890975e+01, 2.90917353e+01, 3.02943731e+01, 3.14970109e+01, 3.26996487e+01, 3.39022865e+01, 3.51049244e+01, 3.63075622e+01, 3.75102000e+01, 3.87128378e+01, 3.99154756e+01, 4.11181135e+01, 4.23207513e+01, 4.35233891e+01, 4.47260269e+01, 4.59286647e+01, 4.71313026e+01, 4.83339404e+01, 4.95365782e+01, 5.07392160e+01, 5.19418538e+01, 5.31444917e+01, 5.43471295e+01, 5.55497673e+01, 5.67524051e+01, 5.79550429e+01, 5.91576808e+01, 6.03603186e+01, 6.15629564e+01, 6.27655942e+01, 6.39682320e+01, 6.51708698e+01, 6.63735077e+01, 6.75761455e+01, 6.87787833e+01, 6.99814211e+01, 7.11840589e+01, 7.23866968e+01, 7.35893346e+01, 7.47919724e+01, 7.59946102e+01, 7.71972480e+01, 7.83998859e+01, 7.96025237e+01, 8.08051615e+01, 8.20077993e+01, 8.32104371e+01, 8.44130750e+01, 8.56157128e+01, 8.68183506e+01, 8.80209884e+01, 8.92236262e+01, 9.04262641e+01, 9.16289019e+01, 9.28315397e+01, 9.40341775e+01, 9.52368153e+01, 9.64394532e+01, 9.76420910e+01, 9.88447288e+01, 1.00047367e+02, 1.01250004e+02, 1.02452642e+02, 1.03655280e+02, 1.04857918e+02, 1.06060556e+02, 1.07263194e+02, 1.08465831e+02, 1.09668469e+02, 1.10871107e+02, 1.12073745e+02, 1.13276383e+02, 1.14479020e+02, 1.15681658e+02, 1.16884296e+02, 1.18086934e+02, 1.19289572e+02, 1.20492210e+02, 1.21694847e+02, 1.22897485e+02, 1.24100123e+02, 1.25302761e+02, 1.26505399e+02, 1.27708036e+02, 1.28910674e+02, 1.30113312e+02, 1.31315950e+02, 1.32518588e+02, 1.33721226e+02, 1.34923863e+02, 1.36126501e+02, 1.37329139e+02, 1.38531777e+02, 1.39734415e+02, 1.40937052e+02, 1.42139690e+02, 1.43342328e+02, 1.44544966e+02, 1.45747604e+02, 1.46950242e+02, 1.48152879e+02, 1.49355517e+02, 1.50558155e+02, 1.51760793e+02, 1.52963431e+02, 1.54166068e+02, 1.55368706e+02, 1.56571344e+02, 1.57773982e+02, 1.58976620e+02, 1.60179258e+02, 1.61381895e+02, 1.62584533e+02, 1.63787171e+02, 1.64989809e+02, 1.66192447e+02, 1.67395084e+02, 1.68597722e+02, 1.69800360e+02, 1.71002998e+02, 1.72205636e+02, 1.73408274e+02, 1.74610911e+02, 1.75813549e+02, 1.77016187e+02, 1.78218825e+02, 1.79421463e+02, 1.80624100e+02, 1.81826738e+02, 1.83029376e+02, 1.84232014e+02, 1.85434652e+02, 1.86637290e+02, 1.87839927e+02, 1.89042565e+02, 1.90245203e+02, 1.91447841e+02, 1.92650479e+02, 1.93853117e+02, 1.95055754e+02, 1.96258392e+02, 1.97461030e+02, 1.98663668e+02, 1.99866306e+02, 2.01068943e+02, 2.02271581e+02, 2.03474219e+02, 2.04676857e+02, 2.05879495e+02, 2.07082133e+02, 2.08284770e+02, 2.09487408e+02, 2.10690046e+02, 2.11892684e+02, 2.13095322e+02, 2.14297959e+02, 2.15500597e+02, 2.16703235e+02, 2.17905873e+02, 2.19108511e+02, 2.20311149e+02, 2.21513786e+02, 2.22716424e+02, 2.23919062e+02, 2.25121700e+02, 2.26324338e+02, 2.27526975e+02, 2.28729613e+02, 2.29932251e+02, 2.31134889e+02, 2.32337527e+02, 2.33540165e+02, 2.34742802e+02, 2.35945440e+02, 2.37148078e+02, 2.38350716e+02, 2.39553354e+02, 2.40755991e+02, 2.41958629e+02, 2.43161267e+02, 2.44363905e+02, 2.45566543e+02, 2.46769181e+02, 2.47971818e+02, 2.49174456e+02, 2.50377094e+02, 2.51579732e+02, 2.52782370e+02, 2.53985007e+02, 2.55187645e+02, 2.56390283e+02, 2.57592921e+02, 2.58795559e+02, 2.59998197e+02, 2.61200834e+02, 2.62403472e+02, 2.63606110e+02, 2.64808748e+02, 2.66011386e+02, 2.67214023e+02, 2.68416661e+02, 2.69619299e+02, 2.70821937e+02, 2.72024575e+02, 2.73227213e+02, 2.74429850e+02, 2.75632488e+02, 2.76835126e+02, 2.78037764e+02, 2.79240402e+02, 2.80443039e+02, 2.81645677e+02, 2.82848315e+02, 2.84050953e+02, 2.85253591e+02, 2.86456229e+02, 2.87658866e+02, 2.88861504e+02, 2.90064142e+02, 2.91266780e+02, 2.92469418e+02, 2.93672056e+02, 2.94874693e+02, 2.96077331e+02, 2.97279969e+02, 2.98482607e+02, 2.99685245e+02, 3.00887882e+02, 3.02090520e+02, 3.03293158e+02, 3.04495796e+02, 3.05698434e+02, 3.06901072e+02, 3.08103709e+02, 3.09306347e+02, 3.10508985e+02, 3.11711623e+02, 3.12914261e+02, 3.14116898e+02, 3.15319536e+02, 3.16522174e+02, 3.17724812e+02, 3.18927450e+02, 3.20130088e+02, 3.21332725e+02, 3.22535363e+02, 3.23738001e+02, 3.24940639e+02, 3.26143277e+02, 3.27345914e+02, 3.28548552e+02, 3.29751190e+02, 3.30953828e+02, 3.32156466e+02, 3.33359104e+02, 3.34561741e+02, 3.35764379e+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))