8. Assessing levelling results#
[1]:
%load_ext autoreload
%autoreload 2
import logging
import geopandas as gpd
import harmonica as hm
import numpy as np
import pandas as pd
import plotly.io as pio
import verde as vd
import airbornegeo
logging.getLogger("airbornegeo").setLevel("INFO")
logging.basicConfig()
pio.renderers.default = "notebook"
/home/airbornegeo/airbornegeo/.pixi/envs/default/lib/python3.13/site-packages/xrft/xrft.py:326: SyntaxWarning: invalid escape sequence '\m'
daft = \mathbb{F}(da - \overline{da})
/home/airbornegeo/airbornegeo/.pixi/envs/default/lib/python3.13/site-packages/xrft/xrft.py:497: SyntaxWarning: invalid escape sequence '\m'
da = \mathbb{F}(daft - \overline{daft})
/home/airbornegeo/airbornegeo/.pixi/envs/default/lib/python3.13/site-packages/xrft/xrft.py:692: SyntaxWarning: invalid escape sequence '\o'
da' = da - \overline{da}
/home/airbornegeo/airbornegeo/.pixi/envs/default/lib/python3.13/site-packages/xrft/xrft.py:767: SyntaxWarning: invalid escape sequence '\o'
da1' = da1 - \overline{da1};\ \ da2' = da2 - \overline{da2}
/home/airbornegeo/airbornegeo/.pixi/envs/default/lib/python3.13/site-packages/xrft/xrft.py:845: SyntaxWarning: invalid escape sequence '\o'
da1' = da1 - \overline{da1};\ \ da2' = da2 - \overline{da2}
/home/airbornegeo/airbornegeo/.pixi/envs/default/lib/python3.13/site-packages/xrft/xrft.py:954: SyntaxWarning: invalid escape sequence '\s'
\text{iso}_{ps} = k_r N^{-1} \sum_{N} |\mathbb{F}(da')|^2
/home/airbornegeo/airbornegeo/.pixi/envs/default/lib/python3.13/site-packages/xrft/xrft.py:1032: SyntaxWarning: invalid escape sequence '\s'
\text{iso}_{ps} = k_r N^{-1} \sum_{N} |\mathbb{F}(da')|^2
/home/airbornegeo/airbornegeo/.pixi/envs/default/lib/python3.13/site-packages/xrft/xrft.py:1118: SyntaxWarning: invalid escape sequence '\s'
\text{iso}_{cs} = k_r N^{-1} \sum_{N} (\mathbb{F}(da1') {\mathbb{F}(da2')}^*)
8.1. Load data#
This is a subset of the BAS AGAP survey over Antarctica’s Gamburtsev Subglacial Mountains. The file is download and subset in the notebook AGAP_magnetic_survey, and the BAS processing steps are repeated in the notebook processing_AGAP_magnetic_survey.
[2]:
data_df = pd.read_csv("data/AGAP_magnetic_survey_processed_blocked.csv")
data_df = data_df[
[
"easting",
"northing",
"height",
"line",
"unixtime",
"distance_along_line",
"mag",
]
]
# for testing limit number of lines
data_df = data_df[~data_df.line.between(133, 142)]
data_df = data_df[~data_df.line.between(168, 176)]
data_df = data_df[
(data_df.line.isin(data_df.line.unique()[::2])) | (data_df.line >= 143)
]
# define flight lines vs tie lines with column 'tie' which is True or False
data_df["tie"] = False
data_df.loc[data_df.line >= 142, "tie"] = True
data_df
[2]:
| easting | northing | height | line | unixtime | distance_along_line | mag | tie | |
|---|---|---|---|---|---|---|---|---|
| 0 | 6.210991e+05 | 159056.748193 | 4110.45 | 1 | 1.229500e+09 | 27.181565 | -33.385 | False |
| 1 | 6.212065e+05 | 159071.301512 | 4114.50 | 1 | 1.229500e+09 | 135.587530 | -35.120 | False |
| 2 | 6.213138e+05 | 159085.113599 | 4117.90 | 1 | 1.229500e+09 | 243.749367 | -36.875 | False |
| 3 | 6.214207e+05 | 159099.184618 | 4120.80 | 1 | 1.229500e+09 | 351.600337 | -38.585 | False |
| 4 | 6.215272e+05 | 159114.303863 | 4123.15 | 1 | 1.229500e+09 | 459.104857 | -40.205 | False |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 703796 | 1.082115e+06 | 112573.528454 | 4191.50 | 206 | 1.231249e+09 | 177936.928871 | -27.040 | True |
| 703797 | 1.082103e+06 | 112648.360155 | 4191.60 | 206 | 1.231249e+09 | 178012.800558 | -28.040 | True |
| 703798 | 1.082084e+06 | 112760.548617 | 4191.80 | 206 | 1.231249e+09 | 178126.596403 | -29.410 | True |
| 703799 | 1.082065e+06 | 112872.636385 | 4192.30 | 206 | 1.231249e+09 | 178240.329983 | -30.840 | True |
| 703800 | 1.082042e+06 | 113004.019427 | 4193.40 | 206 | 1.231249e+09 | 178373.722649 | -40.840 | True |
399208 rows × 8 columns
8.2. Find intersections#
[3]:
# convert dataframe into geodataframe
data_df = gpd.GeoDataFrame(
data_df,
geometry=gpd.points_from_xy(data_df.easting, data_df.northing),
crs="EPSG:3031",
)
[4]:
# calculate theoretical intersection points
inters = airbornegeo.create_intersection_table(
data_df,
plot_map=False,
plot_hist=False,
)
inters
INFO:airbornegeo:found 662 intersections
[4]:
| line | tie | geometry | max_dist | easting | northing | |
|---|---|---|---|---|---|---|
| 0 | 1 | 143 | POINT (1158153 254083) | 16.441255 | 1158153.0 | 254083.0 |
| 1 | 1 | 144 | POINT (1190820 259865) | 24.124887 | 1190820.0 | 259865.0 |
| 2 | 1 | 145 | POINT (1223524 265689) | 17.269650 | 1223524.0 | 265689.0 |
| 3 | 1 | 146 | POINT (1256193 271497) | 31.608179 | 1256193.0 | 271497.0 |
| 4 | 1 | 147 | POINT (1288901 277249) | 50.174377 | 1288901.0 | 277249.0 |
| ... | ... | ... | ... | ... | ... | ... |
| 657 | 125 | 199 | POINT (1318165 302398) | 33.689493 | 1318165.0 | 302398.0 |
| 658 | 125 | 200 | POINT (1350929 308239) | 36.343660 | 1350929.0 | 308239.0 |
| 659 | 127 | 148 | POINT (1319894 292699) | 22.093103 | 1319894.0 | 292699.0 |
| 660 | 127 | 199 | POINT (1319922 292702) | 23.297236 | 1319922.0 | 292702.0 |
| 661 | 127 | 200 | POINT (1352642 298507) | 36.743873 | 1352642.0 | 298507.0 |
662 rows × 6 columns
8.3. Add intersections as rows to the dataframe#
[5]:
data_df, inters = airbornegeo.interpolate_intersections(
data_df,
inters,
to_interp=["mag", "height"],
window_width=500,
method="cubic",
extrapolate=False,
)
[6]:
lines_without_inters = airbornegeo.lines_without_intersections(data_df, inters)
lines_without_inters
[6]:
[np.int64(107),
np.int64(109),
np.int64(129),
np.int64(131),
np.int64(188),
np.int64(189),
np.int64(190),
np.int64(192),
np.int64(193),
np.int64(194),
np.int64(203)]
[7]:
# drop lines without intersections
data_df = data_df[~data_df.line.isin(lines_without_inters)]
8.4. Calculate initial cross-over errors#
[8]:
inters = airbornegeo.calculate_crossover_errors(
data_df,
inters,
data_col="mag",
plot_map=True,
)
[9]:
inters.head()
[9]:
| line | tie | geometry | max_dist | easting | northing | dist_along_flight_line | dist_along_flight_tie | flight_interpolation_type | tie_interpolation_type | flight_height | tie_height | mistie_0 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 143 | POINT (1158153 254083) | 16.441255 | 1158153.0 | 254083.0 | 545768.072695 | 138071.419338 | interpolated | interpolated | 4168.038983 | 4008.397691 | 100.458661 |
| 1 | 1 | 144 | POINT (1190820 259865) | 24.124887 | 1190820.0 | 259865.0 | 578952.394781 | 131585.125284 | interpolated | interpolated | 4174.500813 | 4010.840823 | 32.151483 |
| 2 | 1 | 145 | POINT (1223524 265689) | 17.269650 | 1223524.0 | 265689.0 | 612181.972720 | 147253.496664 | interpolated | interpolated | 3544.149925 | 3995.961216 | 72.936553 |
| 3 | 1 | 146 | POINT (1256193 271497) | 31.608179 | 1256193.0 | 271497.0 | 645372.035087 | 136211.666619 | interpolated | interpolated | 3564.579994 | 3578.174277 | 84.125118 |
| 4 | 1 | 147 | POINT (1288901 277249) | 50.174377 | 1288901.0 | 277249.0 | 678598.170740 | 155115.224990 | interpolated | interpolated | 3536.160719 | 3545.947314 | -7.731396 |
8.5. Grid the pre-levelled data#
[10]:
# block reduce the line data
data_df_blocked = airbornegeo.block_reduce(
data_df,
np.median,
spacing=2000,
reduce_by="distance_along_line",
groupby_column="line",
)
data_df_blocked = data_df_blocked.dropna(
subset=["easting", "northing", "height", "mag"]
)
data_df_blocked.describe()
[10]:
| distance_along_line | easting | northing | height | unixtime | mag | intersecting_line | line | |
|---|---|---|---|---|---|---|---|---|
| count | 18198.000000 | 1.819800e+04 | 18198.000000 | 18198.000000 | 1.698300e+04 | 18198.000000 | 0.0 | 18198.000000 |
| mean | 190481.664973 | 1.010550e+06 | 235793.150394 | 3869.887801 | 1.230898e+09 | -12.042309 | NaN | 98.511155 |
| std | 136436.359312 | 2.580533e+05 | 146263.995765 | 438.825066 | 6.573929e+05 | 88.895060 | NaN | 62.363794 |
| min | 932.773718 | 5.328906e+05 | -302813.880978 | 2478.775000 | 1.229500e+09 | -362.240000 | NaN | 1.000000 |
| 25% | 83307.405473 | 7.839629e+05 | 150247.851427 | 3648.200000 | 1.230456e+09 | -65.695000 | NaN | 49.000000 |
| 50% | 167343.130074 | 9.961314e+05 | 233907.068600 | 4008.825000 | 1.230997e+09 | -22.415000 | NaN | 85.000000 |
| 75% | 263162.179086 | 1.231160e+06 | 324823.087590 | 4201.243750 | 1.231484e+09 | 27.578125 | NaN | 156.000000 |
| max | 744852.096684 | 1.608560e+06 | 695692.176078 | 4495.200000 | 1.232150e+09 | 833.162500 | NaN | 206.000000 |
[11]:
coords = (
data_df_blocked.easting,
data_df_blocked.northing,
data_df_blocked.height,
)
eqs_unlevelled = hm.EquivalentSources(damping=0.1, depth="default", block_size=2000)
eqs_unlevelled.fit(coords, data_df_blocked.mag)
[11]:
EquivalentSources(block_size=2000, damping=0.1)In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
Parameters
| damping | 0.1 | |
| points | None | |
| depth | 'default' | |
| block_size | 2000 | |
| parallel | True | |
| dtype | 'float64' |
[12]:
# Define grid coordinates
grid_coords = vd.grid_coordinates(
region=vd.pad_region(vd.get_region(coords), 10e3),
spacing=2000,
extra_coords=4200, # upward continue
adjust="region",
)
grid_unlevelled = eqs_unlevelled.grid(grid_coords)
grid_unlevelled = vd.distance_mask(
(coords[0], coords[1]), maxdist=10e3, grid=grid_unlevelled
)
grid_unlevelled = grid_unlevelled.reset_coords(names="upward").scalars
grid_unlevelled.plot(robust=True)
[12]:
<matplotlib.collections.QuadMesh at 0x7f0753089d30>
8.6. Level the survey#
[13]:
data_df, inters = airbornegeo.alternating_iterative_line_levelling(
data_df,
inters,
data_col="mag",
levelled_col="mag",
degree=0,
iterations=5,
)
inters.head()
[13]:
| line | tie | geometry | max_dist | easting | northing | dist_along_flight_line | dist_along_flight_tie | flight_interpolation_type | tie_interpolation_type | ... | mistie_1 | mistie_2 | mistie_3 | mistie_4 | mistie_5 | mistie_6 | mistie_7 | mistie_8 | mistie_9 | mistie_10 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 143 | POINT (1158153 254083) | 16.441255 | 1158153.0 | 254083.0 | 545768.072695 | 138071.419338 | interpolated | interpolated | ... | 96.945621 | 72.958517 | 71.904752 | 67.038524 | 67.150418 | 63.393096 | 63.723800 | 60.721570 | 61.069625 | 58.628182 |
| 1 | 1 | 144 | POINT (1190820 259865) | 24.124887 | 1190820.0 | 259865.0 | 578952.394781 | 131585.125284 | interpolated | interpolated | ... | 28.638444 | 19.088634 | 18.034870 | 13.168642 | 13.280535 | 9.523214 | 9.853917 | 6.851688 | 7.199742 | 4.758299 |
| 2 | 1 | 145 | POINT (1223524 265689) | 17.269650 | 1223524.0 | 265689.0 | 612181.972720 | 147253.496664 | interpolated | interpolated | ... | 69.423514 | 49.368210 | 48.314446 | 43.448218 | 43.560111 | 39.802790 | 40.133493 | 37.131264 | 37.479318 | 35.037876 |
| 3 | 1 | 146 | POINT (1256193 271497) | 31.608179 | 1256193.0 | 271497.0 | 645372.035087 | 136211.666619 | interpolated | interpolated | ... | 80.612078 | 60.446633 | 59.392868 | 54.526640 | 54.638534 | 50.881212 | 51.211916 | 48.209686 | 48.557741 | 46.116298 |
| 4 | 1 | 147 | POINT (1288901 277249) | 50.174377 | 1288901.0 | 277249.0 | 678598.170740 | 155115.224990 | interpolated | interpolated | ... | -11.244436 | -2.791611 | -3.845375 | -8.711603 | -8.599710 | -12.357032 | -12.026328 | -15.028558 | -14.680503 | -17.121946 |
5 rows × 23 columns
[14]:
airbornegeo.plot_levelling_convergence(inters)
[15]:
inters = airbornegeo.calculate_crossover_errors(
data_df,
inters,
data_col="mag",
plot_map=True,
)
[16]:
# block reduce the line data
data_df_blocked = airbornegeo.block_reduce(
data_df,
np.median,
spacing=2000,
reduce_by="distance_along_line",
groupby_column="line",
)
data_df_blocked = data_df_blocked.dropna(
subset=["easting", "northing", "height", "mag"]
)
data_df_blocked.describe()
[16]:
| distance_along_line | easting | northing | height | unixtime | mag | intersecting_line | line | |
|---|---|---|---|---|---|---|---|---|
| count | 18198.000000 | 1.819800e+04 | 18198.000000 | 18198.000000 | 1.698300e+04 | 18198.000000 | 0.0 | 18198.000000 |
| mean | 190481.664973 | 1.010550e+06 | 235793.150394 | 3869.887801 | 1.230898e+09 | -18.408009 | NaN | 98.511155 |
| std | 136436.359312 | 2.580533e+05 | 146263.995765 | 438.825066 | 6.573929e+05 | 85.083158 | NaN | 62.363794 |
| min | 932.773718 | 5.328906e+05 | -302813.880978 | 2478.775000 | 1.229500e+09 | -338.586624 | NaN | 1.000000 |
| 25% | 83307.405473 | 7.839629e+05 | 150247.851427 | 3648.200000 | 1.230456e+09 | -69.924084 | NaN | 49.000000 |
| 50% | 167343.130074 | 9.961314e+05 | 233907.068600 | 4008.825000 | 1.230997e+09 | -30.884226 | NaN | 85.000000 |
| 75% | 263162.179086 | 1.231160e+06 | 324823.087590 | 4201.243750 | 1.231484e+09 | 17.898138 | NaN | 156.000000 |
| max | 744852.096684 | 1.608560e+06 | 695692.176078 | 4495.200000 | 1.232150e+09 | 794.541776 | NaN | 206.000000 |
[17]:
coords = (
data_df_blocked.easting,
data_df_blocked.northing,
data_df_blocked.height,
)
eqs_levelled_trend_0 = hm.EquivalentSources(
damping=0.1, depth="default", block_size=2000
)
eqs_levelled_trend_0.fit(coords, data_df_blocked.mag)
[17]:
EquivalentSources(block_size=2000, damping=0.1)In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
Parameters
| damping | 0.1 | |
| points | None | |
| depth | 'default' | |
| block_size | 2000 | |
| parallel | True | |
| dtype | 'float64' |
[18]:
grid_levelled_trend_0 = eqs_levelled_trend_0.grid(grid_coords)
grid_levelled_trend_0 = vd.distance_mask(
(coords[0], coords[1]), maxdist=10e3, grid=grid_levelled_trend_0
)
grid_levelled_trend_0 = grid_levelled_trend_0.reset_coords(names="upward").scalars
grid_levelled_trend_0.plot(robust=True)
[18]:
<matplotlib.collections.QuadMesh at 0x7f07002f9810>
[19]:
(grid_unlevelled - grid_levelled_trend_0).plot(robust=True)
[19]:
<matplotlib.collections.QuadMesh at 0x7f07003625d0>
8.7. Repeat with a trend order of 1#
[20]:
data_df, inters = airbornegeo.alternating_iterative_line_levelling(
data_df,
inters,
data_col="mag",
levelled_col="mag",
degree=1,
iterations=5,
)
inters.head()
[20]:
| line | tie | geometry | max_dist | easting | northing | dist_along_flight_line | dist_along_flight_tie | flight_interpolation_type | tie_interpolation_type | ... | mistie_11 | mistie_12 | mistie_13 | mistie_14 | mistie_15 | mistie_16 | mistie_17 | mistie_18 | mistie_19 | mistie_20 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 143 | POINT (1158153 254083) | 16.441255 | 1158153.0 | 254083.0 | 545768.072695 | 138071.419338 | interpolated | interpolated | ... | 55.628017 | 50.833479 | 48.668087 | 46.896275 | 45.560415 | 44.541105 | 43.723455 | 43.023456 | 42.508024 | 41.987979 |
| 1 | 1 | 144 | POINT (1190820 259865) | 24.124887 | 1190820.0 | 259865.0 | 578952.394781 | 131585.125284 | interpolated | interpolated | ... | 1.119289 | -0.019764 | -2.416675 | -3.516709 | -4.981390 | -5.637918 | -6.532933 | -6.976960 | -7.541316 | -7.855782 |
| 2 | 1 | 145 | POINT (1223524 265689) | 17.269650 | 1223524.0 | 265689.0 | 612181.972720 | 147253.496664 | interpolated | interpolated | ... | 30.759149 | 30.141541 | 27.512797 | 27.085037 | 25.491359 | 25.197815 | 24.225328 | 24.037369 | 23.424022 | 23.315179 |
| 3 | 1 | 146 | POINT (1256193 271497) | 31.608179 | 1256193.0 | 271497.0 | 645372.035087 | 136211.666619 | interpolated | interpolated | ... | 41.198616 | 39.414904 | 36.554601 | 36.801009 | 35.078487 | 35.149071 | 34.099204 | 34.168111 | 33.505831 | 33.603219 |
| 4 | 1 | 147 | POINT (1288901 277249) | 50.174377 | 1288901.0 | 277249.0 | 678598.170740 | 155115.224990 | interpolated | interpolated | ... | -22.679278 | -21.316610 | -24.408724 | -23.490614 | -25.342120 | -24.908710 | -26.036040 | -25.711101 | -26.422367 | -26.119346 |
5 rows × 33 columns
[21]:
airbornegeo.plot_levelling_convergence(inters)
[22]:
inters = airbornegeo.calculate_crossover_errors(
data_df,
inters,
data_col="mag",
plot_map=True,
)
[23]:
# block reduce the line data
data_df_blocked = airbornegeo.block_reduce(
data_df,
np.median,
spacing=2000,
reduce_by="distance_along_line",
groupby_column="line",
)
data_df_blocked = data_df_blocked.dropna(
subset=["easting", "northing", "height", "mag"]
)
data_df_blocked.describe()
[23]:
| distance_along_line | easting | northing | height | unixtime | mag | intersecting_line | line | |
|---|---|---|---|---|---|---|---|---|
| count | 18198.000000 | 1.819800e+04 | 18198.000000 | 18198.000000 | 1.698300e+04 | 18198.000000 | 0.0 | 18198.000000 |
| mean | 190481.664973 | 1.010550e+06 | 235793.150394 | 3869.887801 | 1.230898e+09 | -19.017283 | NaN | 98.511155 |
| std | 136436.359312 | 2.580533e+05 | 146263.995765 | 438.825066 | 6.573929e+05 | 99.987430 | NaN | 62.363794 |
| min | 932.773718 | 5.328906e+05 | -302813.880978 | 2478.775000 | 1.229500e+09 | -684.449432 | NaN | 1.000000 |
| 25% | 83307.405473 | 7.839629e+05 | 150247.851427 | 3648.200000 | 1.230456e+09 | -70.099556 | NaN | 49.000000 |
| 50% | 167343.130074 | 9.961314e+05 | 233907.068600 | 4008.825000 | 1.230997e+09 | -29.697816 | NaN | 85.000000 |
| 75% | 263162.179086 | 1.231160e+06 | 324823.087590 | 4201.243750 | 1.231484e+09 | 21.574995 | NaN | 156.000000 |
| max | 744852.096684 | 1.608560e+06 | 695692.176078 | 4495.200000 | 1.232150e+09 | 805.336305 | NaN | 206.000000 |
[24]:
coords = (
data_df_blocked.easting,
data_df_blocked.northing,
data_df_blocked.height,
)
eqs_levelled_trend_1 = hm.EquivalentSources(
damping=0.1, depth="default", block_size=2000
)
eqs_levelled_trend_1.fit(coords, data_df_blocked.mag)
[24]:
EquivalentSources(block_size=2000, damping=0.1)In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
Parameters
| damping | 0.1 | |
| points | None | |
| depth | 'default' | |
| block_size | 2000 | |
| parallel | True | |
| dtype | 'float64' |
[25]:
grid_levelled_trend_1 = eqs_levelled_trend_1.grid(grid_coords)
grid_levelled_trend_1 = vd.distance_mask(
(coords[0], coords[1]), maxdist=10e3, grid=grid_levelled_trend_1
)
grid_levelled_trend_1 = grid_levelled_trend_1.reset_coords(names="upward").scalars
grid_levelled_trend_1.plot(robust=True)
[25]:
<matplotlib.collections.QuadMesh at 0x7f070020a350>
[26]:
(grid_unlevelled - grid_levelled_trend_1).plot(robust=True)
[26]:
<matplotlib.collections.QuadMesh at 0x7f0700156fd0>
[27]:
(grid_levelled_trend_0 - grid_levelled_trend_1).plot(robust=True)
[27]:
<matplotlib.collections.QuadMesh at 0x7f0700293d90>
8.8. Use spatial derivatives to assess levelling performance#
[29]:
import invert4geom
import polartoolkit as ptk
titles = [
"Unlevelled ",
"Levelled trend 0",
"Levelled trend 1",
]
for i, g in enumerate(
[
grid_unlevelled,
grid_levelled_trend_0,
grid_levelled_trend_1,
]
):
east_deriv = invert4geom.filter_grid(
g,
filter_type="easting_deriv",
)
north_deriv = invert4geom.filter_grid(g, filter_type="northing_deriv")
up_deriv = invert4geom.filter_grid(
g,
filter_type="up_deriv",
)
total_gradient = invert4geom.filter_grid(
g,
filter_type="total_gradient",
)
fig = ptk.subplots(
[east_deriv, north_deriv, up_deriv, total_gradient],
fig_title=titles[i],
titles=[
"Easting derivative",
"Northing derivative",
"Upward derivative",
"Total gradient",
],
cmap="balance+h0",
robust=True,
fig_height=10,
)
fig.show()
/home/airbornegeo/airbornegeo/.pixi/envs/default/lib/python3.13/site-packages/harmonica/filters/_fft.py:48: FutureWarning: dropping variables using `drop` is deprecated; use drop_vars.
grid = grid.drop(bad_coords)
/home/airbornegeo/airbornegeo/.pixi/envs/default/lib/python3.13/site-packages/xrft/xrft.py:560: FutureWarning: Default ifft's behaviour (lag=None) changed! Default value of lag was zero (centered output coordinates) and is now set to transformed coordinate's attribute: 'direct_lag'.
warnings.warn(msg, FutureWarning)
/home/airbornegeo/airbornegeo/.pixi/envs/default/lib/python3.13/site-packages/harmonica/filters/_fft.py:48: FutureWarning: dropping variables using `drop` is deprecated; use drop_vars.
grid = grid.drop(bad_coords)
/home/airbornegeo/airbornegeo/.pixi/envs/default/lib/python3.13/site-packages/xrft/xrft.py:560: FutureWarning: Default ifft's behaviour (lag=None) changed! Default value of lag was zero (centered output coordinates) and is now set to transformed coordinate's attribute: 'direct_lag'.
warnings.warn(msg, FutureWarning)
/home/airbornegeo/airbornegeo/.pixi/envs/default/lib/python3.13/site-packages/harmonica/filters/_fft.py:48: FutureWarning: dropping variables using `drop` is deprecated; use drop_vars.
grid = grid.drop(bad_coords)
/home/airbornegeo/airbornegeo/.pixi/envs/default/lib/python3.13/site-packages/xrft/xrft.py:560: FutureWarning: Default ifft's behaviour (lag=None) changed! Default value of lag was zero (centered output coordinates) and is now set to transformed coordinate's attribute: 'direct_lag'.
warnings.warn(msg, FutureWarning)
/home/airbornegeo/airbornegeo/.pixi/envs/default/lib/python3.13/site-packages/harmonica/filters/_fft.py:48: FutureWarning: dropping variables using `drop` is deprecated; use drop_vars.
grid = grid.drop(bad_coords)
/home/airbornegeo/airbornegeo/.pixi/envs/default/lib/python3.13/site-packages/xrft/xrft.py:560: FutureWarning: Default ifft's behaviour (lag=None) changed! Default value of lag was zero (centered output coordinates) and is now set to transformed coordinate's attribute: 'direct_lag'.
warnings.warn(msg, FutureWarning)
/home/airbornegeo/airbornegeo/.pixi/envs/default/lib/python3.13/site-packages/harmonica/filters/_fft.py:48: FutureWarning: dropping variables using `drop` is deprecated; use drop_vars.
grid = grid.drop(bad_coords)
/home/airbornegeo/airbornegeo/.pixi/envs/default/lib/python3.13/site-packages/xrft/xrft.py:560: FutureWarning: Default ifft's behaviour (lag=None) changed! Default value of lag was zero (centered output coordinates) and is now set to transformed coordinate's attribute: 'direct_lag'.
warnings.warn(msg, FutureWarning)
/home/airbornegeo/airbornegeo/.pixi/envs/default/lib/python3.13/site-packages/harmonica/filters/_fft.py:48: FutureWarning: dropping variables using `drop` is deprecated; use drop_vars.
grid = grid.drop(bad_coords)
/home/airbornegeo/airbornegeo/.pixi/envs/default/lib/python3.13/site-packages/xrft/xrft.py:560: FutureWarning: Default ifft's behaviour (lag=None) changed! Default value of lag was zero (centered output coordinates) and is now set to transformed coordinate's attribute: 'direct_lag'.
warnings.warn(msg, FutureWarning)
The above plots show the easting, northing, and upward derivatives, and the total gradients, for the unlevelled grid, and the grid levelled with trend orders 0 and 1. These highlight the levelling errors in the data. These errors appear to be significantly reduced with the levelling.