Example of sampling#

Here we illustrate an example of how to generate samples using our small Python package smpsite. Many of the sampling capabilities are directly imported from pmagpy.

import pmagpy.pmag as pmag
import pmagpy.ipmag as ipmag
import matplotlib.pyplot as plt
import smpsite as smp

import numpy as np
np.random.seed(666)

%matplotlib inline

Define the parameters of the sample#

We define a parameter class defined inside smpsite that allow us to specify all the parameters of interest at the same time. These parameters include:

  • N: Total number of sites

  • n0: Number of samples per site

  • kappa_within_site: Concentration parameter of the Fisher distribution within each site

  • site_lat: Latitude of the site

  • site_long: Longitude of the site

  • outlier_rate: Fraction of samples that are randomly taken from the uniform distribution in the sphere, with 0.0 representing no outliers and 1.0 representing all outliers.

  • secular_method: Method used to sample the VGPs. It includes G, tk03 and Fisher.

  • kappa_secular: In case of secular_method="Fisher", it specifies the concentration parameter of the Fisher distribution.

params0 = smp.Params(N=10,
                     n0=5,
                     kappa_within_site=100,
                     site_lat=10, 
                     site_long=0,
                     outlier_rate=0.10,
                     secular_method="G",
                     kappa_secular=None)

Generate the sample#

Once the parameters are specified, we can simulate the sample data:

%%time

df_sample = smp.generate_samples(params0)
df_sample.head()
CPU times: user 17.9 ms, sys: 876 µs, total: 18.8 ms
Wall time: 17.6 ms
sample_site vgp_long vgp_lat vgp_dec vgp_inc is_outlier
0 0 126.657018 82.567616 5.984268 10.932745 0
1 0 127.014390 76.856329 10.467458 3.924856 0
2 0 91.215608 78.611284 11.548712 18.618003 0
3 0 103.137241 78.865732 10.929083 14.380461 0
4 0 68.461601 -57.543217 150.016322 5.433526 1

Plot the simulated sample data#

We can plot the declination and inclination of all of the simulated samples.

plt.figure()
ipmag.plot_net(1)
ipmag.plot_di(dec=df_sample.vgp_dec.values, inc=df_sample.vgp_inc.values)
plt.title('declination/inclination of samples')
plt.show()
../_images/7a98104eec81c361601ba6b47c43d0cf7ba110fdb0d2d7fa2b6351d6359a8118.png

The declination/inclination can be plotted as colored them by site

# Create a color map based on unique 'sample_site' values
unique_sites = df_sample['sample_site'].unique()
colors = plt.cm.viridis(np.linspace(0, 1, len(unique_sites)))
color_map = dict(zip(unique_sites, colors))

ipmag.plot_net(1)

# Use a set to track sites that have already been added to the legend
added_legend_sites = set()

# Iterate through the dataframe and plot each value with its unique color
for index, row in df_sample.iterrows():
    site = row['sample_site']
    color = color_map[site]
    # Using your given column names for declination and inclination
    ipmag.plot_di(row['vgp_dec'], row['vgp_inc'], color=color)
    
    # If the site hasn't been added to the legend, add it
    if site not in added_legend_sites:
        # Use marker='o' for circles, linestyle='' to remove line, and convert site to int for the label
        plt.plot([], [], 'o', label=int(site), color=color, linestyle='')
        added_legend_sites.add(site)

# Show the legend
plt.legend(title='sites',loc='best')
plt.title('declination/inclination of samples\ncolored by site')
plt.show()
../_images/957281bc82379aaa6becc418f1aa073ac8ca61543ac7717457e734e3cfaf3675.png

Calculate pole position and calculate angular error#

mean_pole = smp.estimate_pole(df_sample, params0, ignore_outliers="True")
print(mean_pole)
angular_error = pmag.angle([mean_pole['pole_dec'], mean_pole['pole_inc']], [0, 90])
print('The angular error is: ', round(angular_error[0],1), 'degrees')
{'pole_dec': 112.27111493549478, 'pole_inc': 87.17580406361836, 'S2_vgp': 256.9146243330398, 'total_samples': 48.0, 'samples_per_site': 5, 'alpha95': 9.814841392668617}
The angular error is:  2.8 degrees

Plot the pole position#

map_axis = ipmag.make_orthographic_map(central_longitude=0,central_latitude=90)
ipmag.plot_pole(map_axis, mean_pole['pole_dec'], mean_pole['pole_inc'], mean_pole['alpha95'], color='r', marker='s', label='Mean Pole')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:6195: DeprecationWarning: invalid escape sequence \d
  pattern = re.compile('[4][-]\d')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:6202: DeprecationWarning: invalid escape sequence \d
  pattern = re.compile('[7][-]\d')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:7886: DeprecationWarning: invalid escape sequence \h
  sf.write('\hline\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:7891: DeprecationWarning: invalid escape sequence \h
  f.write('\hline\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:7896: DeprecationWarning: invalid escape sequence \h
  fI.write('\hline\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:7902: DeprecationWarning: invalid escape sequence \h
  cr.write('\hline\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:7908: DeprecationWarning: invalid escape sequence \h
  fsp.write('\hline\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:7942: DeprecationWarning: invalid escape sequence \h
  f.write('\hline\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:7943: DeprecationWarning: invalid escape sequence \h
  sf.write('\hline\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:7944: DeprecationWarning: invalid escape sequence \h
  fI.write('\hline\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:7946: DeprecationWarning: invalid escape sequence \h
  cr.write('\hline\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:7948: DeprecationWarning: invalid escape sequence \h
  fsp.write('\hline\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:8060: DeprecationWarning: invalid escape sequence \h
  f.write('\hline\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:8061: DeprecationWarning: invalid escape sequence \h
  sf.write('\hline\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:8062: DeprecationWarning: invalid escape sequence \h
  fI.write('\hline\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:8063: DeprecationWarning: invalid escape sequence \e
  f.write('\end{longtable}\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:8064: DeprecationWarning: invalid escape sequence \e
  sf.write('\end{longtable}\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:8065: DeprecationWarning: invalid escape sequence \e
  fI.write('\end{longtable}\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:8066: DeprecationWarning: invalid escape sequence \e
  f.write('\end{document}\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:8067: DeprecationWarning: invalid escape sequence \e
  sf.write('\end{document}\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:8068: DeprecationWarning: invalid escape sequence \e
  fI.write('\end{document}\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:8070: DeprecationWarning: invalid escape sequence \h
  fsp.write('\hline\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:8071: DeprecationWarning: invalid escape sequence \e
  fsp.write('\end{longtable}\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:8072: DeprecationWarning: invalid escape sequence \e
  fsp.write('\end{document}\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:8074: DeprecationWarning: invalid escape sequence \h
  cr.write('\hline\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:8075: DeprecationWarning: invalid escape sequence \e
  cr.write('\end{longtable}\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:8076: DeprecationWarning: invalid escape sequence \e
  cr.write('\end{document}\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:11626: DeprecationWarning: invalid escape sequence \w
  'LP-*[\w]*-ARM')]
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:11633: DeprecationWarning: invalid escape sequence \s
  cond = spec_df.method_codes.str.contains('(^|[\s\:])LT-PTRM')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:12483: DeprecationWarning: invalid escape sequence \d
  directions_out.write('\documentclass{article}\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:12489: DeprecationWarning: invalid escape sequence \e
  directions_out.write('\end{document}\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:12504: DeprecationWarning: invalid escape sequence \d
  intensities_out.write('\documentclass{article}\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:12510: DeprecationWarning: invalid escape sequence \e
  intensities_out.write('\end{document}\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:12542: DeprecationWarning: invalid escape sequence \d
  info_out.write('\documentclass{article}\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:12548: DeprecationWarning: invalid escape sequence \e
  info_out.write('\end{document}\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:12605: DeprecationWarning: invalid escape sequence \d
  info_out.write('\documentclass{article}\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:12617: DeprecationWarning: invalid escape sequence \e
  info_out.write('\end{landscape}\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:12618: DeprecationWarning: invalid escape sequence \e
  info_out.write('\end{document}\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:12681: DeprecationWarning: invalid escape sequence \d
  info_out.write('\documentclass{article}\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:12689: DeprecationWarning: invalid escape sequence \e
  info_out.write('\end{document}\n')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:13658: DeprecationWarning: invalid escape sequence \c
  plt.ylabel('$\chi$ ($\mu$SI)')
/opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:13678: DeprecationWarning: invalid escape sequence \c
  plt.ylabel('$\chi$ ($\mu$SI)')
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[7], line 1
----> 1 map_axis = ipmag.make_orthographic_map(central_longitude=0,central_latitude=90)
      2 ipmag.plot_pole(map_axis, mean_pole['pole_dec'], mean_pole['pole_inc'], mean_pole['alpha95'], color='r', marker='s', label='Mean Pole')

File /opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/pmagpy/ipmag.py:1868, in make_orthographic_map(central_longitude, central_latitude, figsize, add_land, land_color, land_edge_color, add_ocean, ocean_color, grid_lines, lat_grid, lon_grid)
   1866     return
   1867 fig = plt.figure(figsize=figsize)
-> 1868 map_projection = LowerThresholdOrthographic(
   1869     central_longitude=central_longitude, central_latitude=central_latitude)
   1870 ax = plt.axes(projection=map_projection)
   1871 ax.set_global()

File /opt/hostedtoolcache/Python/3.9.18/x64/lib/python3.9/site-packages/cartopy/crs.py:2069, in Orthographic.__init__(self, central_longitude, central_latitude, globe)
   2067 self._x_limits = mins[0], maxs[0]
   2068 self._y_limits = mins[1], maxs[1]
-> 2069 self.threshold = np.diff(self._x_limits)[0] * 0.02

AttributeError: can't set attribute
<Figure size 800x800 with 0 Axes>