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]:
To retrieve the masked data array, simply call the node that is applying the masks:
[8]:
masking_node()
[8]:
scipp.DataArray (885.21 KB)
- y: 300
- x: 300
- x(x [bin-edge])float64cm-83.413, -81.831, ..., 389.381, 390.962
Values:
array([-83.41271904, -81.83146846, -80.25021788, -78.6689673 , -77.08771671, -75.50646613, -73.92521555, -72.34396497, -70.76271438, -69.1814638 , -67.60021322, -66.01896264, -64.43771205, -62.85646147, -61.27521089, -59.69396031, -58.11270972, -56.53145914, -54.95020856, -53.36895798, -51.78770739, -50.20645681, -48.62520623, -47.04395565, -45.46270506, -43.88145448, -42.3002039 , -40.71895332, -39.13770273, -37.55645215, -35.97520157, -34.39395098, -32.8127004 , -31.23144982, -29.65019924, -28.06894865, -26.48769807, -24.90644749, -23.32519691, -21.74394632, -20.16269574, -18.58144516, -17.00019458, -15.41894399, -13.83769341, -12.25644283, -10.67519225, -9.09394166, -7.51269108, -5.9314405 , -4.35018992, -2.76893933, -1.18768875, 0.39356183, 1.97481241, 3.556063 , 5.13731358, 6.71856416, 8.29981474, 9.88106533, 11.46231591, 13.04356649, 14.62481707, 16.20606766, 17.78731824, 19.36856882, 20.9498194 , 22.53106999, 24.11232057, 25.69357115, 27.27482173, 28.85607232, 30.4373229 , 32.01857348, 33.59982407, 35.18107465, 36.76232523, 38.34357581, 39.9248264 , 41.50607698, 43.08732756, 44.66857814, 46.24982873, 47.83107931, 49.41232989, 50.99358047, 52.57483106, 54.15608164, 55.73733222, 57.3185828 , 58.89983339, 60.48108397, 62.06233455, 63.64358513, 65.22483572, 66.8060863 , 68.38733688, 69.96858746, 71.54983805, 73.13108863, 74.71233921, 76.29358979, 77.87484038, 79.45609096, 81.03734154, 82.61859212, 84.19984271, 85.78109329, 87.36234387, 88.94359445, 90.52484504, 92.10609562, 93.6873462 , 95.26859678, 96.84984737, 98.43109795, 100.01234853, 101.59359911, 103.1748497 , 104.75610028, 106.33735086, 107.91860145, 109.49985203, 111.08110261, 112.66235319, 114.24360378, 115.82485436, 117.40610494, 118.98735552, 120.56860611, 122.14985669, 123.73110727, 125.31235785, 126.89360844, 128.47485902, 130.0561096 , 131.63736018, 133.21861077, 134.79986135, 136.38111193, 137.96236251, 139.5436131 , 141.12486368, 142.70611426, 144.28736484, 145.86861543, 147.44986601, 149.03111659, 150.61236717, 152.19361776, 153.77486834, 155.35611892, 156.9373695 , 158.51862009, 160.09987067, 161.68112125, 163.26237183, 164.84362242, 166.424873 , 168.00612358, 169.58737416, 171.16862475, 172.74987533, 174.33112591, 175.9123765 , 177.49362708, 179.07487766, 180.65612824, 182.23737883, 183.81862941, 185.39987999, 186.98113057, 188.56238116, 190.14363174, 191.72488232, 193.3061329 , 194.88738349, 196.46863407, 198.04988465, 199.63113523, 201.21238582, 202.7936364 , 204.37488698, 205.95613756, 207.53738815, 209.11863873, 210.69988931, 212.28113989, 213.86239048, 215.44364106, 217.02489164, 218.60614222, 220.18739281, 221.76864339, 223.34989397, 224.93114455, 226.51239514, 228.09364572, 229.6748963 , 231.25614688, 232.83739747, 234.41864805, 235.99989863, 237.58114921, 239.1623998 , 240.74365038, 242.32490096, 243.90615155, 245.48740213, 247.06865271, 248.64990329, 250.23115388, 251.81240446, 253.39365504, 254.97490562, 256.55615621, 258.13740679, 259.71865737, 261.29990795, 262.88115854, 264.46240912, 266.0436597 , 267.62491028, 269.20616087, 270.78741145, 272.36866203, 273.94991261, 275.5311632 , 277.11241378, 278.69366436, 280.27491494, 281.85616553, 283.43741611, 285.01866669, 286.59991727, 288.18116786, 289.76241844, 291.34366902, 292.9249196 , 294.50617019, 296.08742077, 297.66867135, 299.24992193, 300.83117252, 302.4124231 , 303.99367368, 305.57492426, 307.15617485, 308.73742543, 310.31867601, 311.8999266 , 313.48117718, 315.06242776, 316.64367834, 318.22492893, 319.80617951, 321.38743009, 322.96868067, 324.54993126, 326.13118184, 327.71243242, 329.293683 , 330.87493359, 332.45618417, 334.03743475, 335.61868533, 337.19993592, 338.7811865 , 340.36243708, 341.94368766, 343.52493825, 345.10618883, 346.68743941, 348.26868999, 349.84994058, 351.43119116, 353.01244174, 354.59369232, 356.17494291, 357.75619349, 359.33744407, 360.91869465, 362.49994524, 364.08119582, 365.6624464 , 367.24369698, 368.82494757, 370.40619815, 371.98744873, 373.56869931, 375.1499499 , 376.73120048, 378.31245106, 379.89370165, 381.47495223, 383.05620281, 384.63745339, 386.21870398, 387.79995456, 389.38120514, 390.96245572]) - y(y [bin-edge])float64cm-30.011, -28.816, ..., 327.244, 328.438
Values:
array([-3.00112823e+01, -2.88164499e+01, -2.76216176e+01, -2.64267852e+01, -2.52319528e+01, -2.40371205e+01, -2.28422881e+01, -2.16474557e+01, -2.04526233e+01, -1.92577910e+01, -1.80629586e+01, -1.68681262e+01, -1.56732939e+01, -1.44784615e+01, -1.32836291e+01, -1.20887968e+01, -1.08939644e+01, -9.69913201e+00, -8.50429964e+00, -7.30946727e+00, -6.11463490e+00, -4.91980253e+00, -3.72497016e+00, -2.53013779e+00, -1.33530542e+00, -1.40473051e-01, 1.05435932e+00, 2.24919169e+00, 3.44402406e+00, 4.63885643e+00, 5.83368880e+00, 7.02852117e+00, 8.22335354e+00, 9.41818591e+00, 1.06130183e+01, 1.18078506e+01, 1.30026830e+01, 1.41975154e+01, 1.53923478e+01, 1.65871801e+01, 1.77820125e+01, 1.89768449e+01, 2.01716772e+01, 2.13665096e+01, 2.25613420e+01, 2.37561743e+01, 2.49510067e+01, 2.61458391e+01, 2.73406715e+01, 2.85355038e+01, 2.97303362e+01, 3.09251686e+01, 3.21200009e+01, 3.33148333e+01, 3.45096657e+01, 3.57044980e+01, 3.68993304e+01, 3.80941628e+01, 3.92889952e+01, 4.04838275e+01, 4.16786599e+01, 4.28734923e+01, 4.40683246e+01, 4.52631570e+01, 4.64579894e+01, 4.76528217e+01, 4.88476541e+01, 5.00424865e+01, 5.12373189e+01, 5.24321512e+01, 5.36269836e+01, 5.48218160e+01, 5.60166483e+01, 5.72114807e+01, 5.84063131e+01, 5.96011454e+01, 6.07959778e+01, 6.19908102e+01, 6.31856426e+01, 6.43804749e+01, 6.55753073e+01, 6.67701397e+01, 6.79649720e+01, 6.91598044e+01, 7.03546368e+01, 7.15494691e+01, 7.27443015e+01, 7.39391339e+01, 7.51339663e+01, 7.63287986e+01, 7.75236310e+01, 7.87184634e+01, 7.99132957e+01, 8.11081281e+01, 8.23029605e+01, 8.34977928e+01, 8.46926252e+01, 8.58874576e+01, 8.70822900e+01, 8.82771223e+01, 8.94719547e+01, 9.06667871e+01, 9.18616194e+01, 9.30564518e+01, 9.42512842e+01, 9.54461165e+01, 9.66409489e+01, 9.78357813e+01, 9.90306137e+01, 1.00225446e+02, 1.01420278e+02, 1.02615111e+02, 1.03809943e+02, 1.05004776e+02, 1.06199608e+02, 1.07394440e+02, 1.08589273e+02, 1.09784105e+02, 1.10978937e+02, 1.12173770e+02, 1.13368602e+02, 1.14563434e+02, 1.15758267e+02, 1.16953099e+02, 1.18147932e+02, 1.19342764e+02, 1.20537596e+02, 1.21732429e+02, 1.22927261e+02, 1.24122093e+02, 1.25316926e+02, 1.26511758e+02, 1.27706591e+02, 1.28901423e+02, 1.30096255e+02, 1.31291088e+02, 1.32485920e+02, 1.33680752e+02, 1.34875585e+02, 1.36070417e+02, 1.37265249e+02, 1.38460082e+02, 1.39654914e+02, 1.40849747e+02, 1.42044579e+02, 1.43239411e+02, 1.44434244e+02, 1.45629076e+02, 1.46823908e+02, 1.48018741e+02, 1.49213573e+02, 1.50408406e+02, 1.51603238e+02, 1.52798070e+02, 1.53992903e+02, 1.55187735e+02, 1.56382567e+02, 1.57577400e+02, 1.58772232e+02, 1.59967065e+02, 1.61161897e+02, 1.62356729e+02, 1.63551562e+02, 1.64746394e+02, 1.65941226e+02, 1.67136059e+02, 1.68330891e+02, 1.69525723e+02, 1.70720556e+02, 1.71915388e+02, 1.73110221e+02, 1.74305053e+02, 1.75499885e+02, 1.76694718e+02, 1.77889550e+02, 1.79084382e+02, 1.80279215e+02, 1.81474047e+02, 1.82668880e+02, 1.83863712e+02, 1.85058544e+02, 1.86253377e+02, 1.87448209e+02, 1.88643041e+02, 1.89837874e+02, 1.91032706e+02, 1.92227539e+02, 1.93422371e+02, 1.94617203e+02, 1.95812036e+02, 1.97006868e+02, 1.98201700e+02, 1.99396533e+02, 2.00591365e+02, 2.01786197e+02, 2.02981030e+02, 2.04175862e+02, 2.05370695e+02, 2.06565527e+02, 2.07760359e+02, 2.08955192e+02, 2.10150024e+02, 2.11344856e+02, 2.12539689e+02, 2.13734521e+02, 2.14929354e+02, 2.16124186e+02, 2.17319018e+02, 2.18513851e+02, 2.19708683e+02, 2.20903515e+02, 2.22098348e+02, 2.23293180e+02, 2.24488013e+02, 2.25682845e+02, 2.26877677e+02, 2.28072510e+02, 2.29267342e+02, 2.30462174e+02, 2.31657007e+02, 2.32851839e+02, 2.34046671e+02, 2.35241504e+02, 2.36436336e+02, 2.37631169e+02, 2.38826001e+02, 2.40020833e+02, 2.41215666e+02, 2.42410498e+02, 2.43605330e+02, 2.44800163e+02, 2.45994995e+02, 2.47189828e+02, 2.48384660e+02, 2.49579492e+02, 2.50774325e+02, 2.51969157e+02, 2.53163989e+02, 2.54358822e+02, 2.55553654e+02, 2.56748486e+02, 2.57943319e+02, 2.59138151e+02, 2.60332984e+02, 2.61527816e+02, 2.62722648e+02, 2.63917481e+02, 2.65112313e+02, 2.66307145e+02, 2.67501978e+02, 2.68696810e+02, 2.69891643e+02, 2.71086475e+02, 2.72281307e+02, 2.73476140e+02, 2.74670972e+02, 2.75865804e+02, 2.77060637e+02, 2.78255469e+02, 2.79450302e+02, 2.80645134e+02, 2.81839966e+02, 2.83034799e+02, 2.84229631e+02, 2.85424463e+02, 2.86619296e+02, 2.87814128e+02, 2.89008960e+02, 2.90203793e+02, 2.91398625e+02, 2.92593458e+02, 2.93788290e+02, 2.94983122e+02, 2.96177955e+02, 2.97372787e+02, 2.98567619e+02, 2.99762452e+02, 3.00957284e+02, 3.02152117e+02, 3.03346949e+02, 3.04541781e+02, 3.05736614e+02, 3.06931446e+02, 3.08126278e+02, 3.09321111e+02, 3.10515943e+02, 3.11710776e+02, 3.12905608e+02, 3.14100440e+02, 3.15295273e+02, 3.16490105e+02, 3.17684937e+02, 3.18879770e+02, 3.20074602e+02, 3.21269434e+02, 3.22464267e+02, 3.23659099e+02, 3.24853932e+02, 3.26048764e+02, 3.27243596e+02, 3.28438429e+02])
- (y, x)float64counts1.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)boolFalse, 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)boolFalse, 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))