Spectra : stemplot¶
Once you have a table, one way to visualise how the ion peaks are distributed is to use
stemplot(), which you can also access from your
dataframe using the mz accessor:
import matplotlib.pyplot as plt
from interferences import build_table
from pyrolite.geochem.ind import REE
Let’s build a table to play with first, focusing on potential interferences for thulium (Tm), which has only one stable isotope (\(\mathrm{^{169}Tm}\)), and is susceptible to interferences, especially for quadrupole ICP-MS:
Out:
0%| | 0/113 [00:00<?, ?it/s]
: 0%| | 0/113 [00:00<?, ?it/s]
Gd @ 14 rows : 0%| | 0/113 [00:00<?, ?it/s]
Tb @ 2 rows : 0%| | 0/113 [00:00<?, ?it/s]
Dy @ 14 rows : 0%| | 0/113 [00:00<?, ?it/s]
Ho @ 2 rows : 0%| | 0/113 [00:00<?, ?it/s]
Er @ 12 rows : 0%| | 0/113 [00:00<?, ?it/s]
Tm @ 2 rows : 0%| | 0/113 [00:00<?, ?it/s]
Yb @ 14 rows : 0%| | 0/113 [00:00<?, ?it/s]
Lu @ 4 rows : 0%| | 0/113 [00:00<?, ?it/s]
La-O @ 12 rows : 0%| | 0/113 [00:00<?, ?it/s]
La-N @ 8 rows : 0%| | 0/113 [00:00<?, ?it/s]
Ce-O @ 24 rows : 0%| | 0/113 [00:00<?, ?it/s]
Ce-N @ 16 rows : 0%| | 0/113 [00:00<?, ?it/s]
Pr-O @ 6 rows : 0%| | 0/113 [00:00<?, ?it/s]
Pr-N @ 4 rows : 0%| | 0/113 [00:00<?, ?it/s]
Nd-O @ 42 rows : 0%| | 0/113 [00:00<?, ?it/s]
Nd-N @ 28 rows : 0%| | 0/113 [00:00<?, ?it/s]
Sm-O @ 42 rows : 0%| | 0/113 [00:00<?, ?it/s]
Sm-N @ 28 rows : 0%| | 0/113 [00:00<?, ?it/s]
Eu-O @ 12 rows : 0%| | 0/113 [00:00<?, ?it/s]
Eu-O @ 12 rows : 17%|#6 | 19/113 [00:00<00:00, 183.34it/s]
Eu-H @ 8 rows : 17%|#6 | 19/113 [00:00<00:00, 183.34it/s]
Eu-N @ 8 rows : 17%|#6 | 19/113 [00:00<00:00, 183.34it/s]
Gd-O @ 42 rows : 17%|#6 | 19/113 [00:00<00:00, 183.34it/s]
Gd-H @ 28 rows : 17%|#6 | 19/113 [00:00<00:00, 183.34it/s]
Gd-N @ 28 rows : 17%|#6 | 19/113 [00:00<00:00, 183.34it/s]
Gd-Sm @ 98 rows : 17%|#6 | 19/113 [00:00<00:00, 183.34it/s]
Gd-Eu @ 28 rows : 17%|#6 | 19/113 [00:00<00:00, 183.34it/s]
Gd-Gd @ 56 rows : 17%|#6 | 19/113 [00:00<00:00, 183.34it/s]
Tb-O @ 6 rows : 17%|#6 | 19/113 [00:00<00:00, 183.34it/s]
Tb-H @ 4 rows : 17%|#6 | 19/113 [00:00<00:00, 183.34it/s]
Tb-N @ 4 rows : 17%|#6 | 19/113 [00:00<00:00, 183.34it/s]
Tb-Sm @ 14 rows : 17%|#6 | 19/113 [00:00<00:00, 183.34it/s]
Tb-Eu @ 4 rows : 17%|#6 | 19/113 [00:00<00:00, 183.34it/s]
Tb-Gd @ 14 rows : 17%|#6 | 19/113 [00:00<00:00, 183.34it/s]
Tb-Tb @ 2 rows : 17%|#6 | 19/113 [00:00<00:00, 183.34it/s]
Dy-O @ 42 rows : 17%|#6 | 19/113 [00:00<00:00, 183.34it/s]
Dy-H @ 28 rows : 17%|#6 | 19/113 [00:00<00:00, 183.34it/s]
Dy-N @ 28 rows : 17%|#6 | 19/113 [00:00<00:00, 183.34it/s]
Dy-Nd @ 98 rows : 17%|#6 | 19/113 [00:00<00:00, 183.34it/s]
Dy-Nd @ 98 rows : 34%|###3 | 38/113 [00:00<00:00, 175.51it/s]
Dy-Sm @ 98 rows : 34%|###3 | 38/113 [00:00<00:00, 175.51it/s]
Dy-Eu @ 28 rows : 34%|###3 | 38/113 [00:00<00:00, 175.51it/s]
Dy-Gd @ 98 rows : 34%|###3 | 38/113 [00:00<00:00, 175.51it/s]
Dy-Tb @ 14 rows : 34%|###3 | 38/113 [00:00<00:00, 175.51it/s]
Dy-Dy @ 56 rows : 34%|###3 | 38/113 [00:00<00:00, 175.51it/s]
Ho-O @ 6 rows : 34%|###3 | 38/113 [00:00<00:00, 175.51it/s]
Ho-H @ 4 rows : 34%|###3 | 38/113 [00:00<00:00, 175.51it/s]
Ho-N @ 4 rows : 34%|###3 | 38/113 [00:00<00:00, 175.51it/s]
Ho-Ce @ 8 rows : 34%|###3 | 38/113 [00:00<00:00, 175.51it/s]
Ho-Pr @ 2 rows : 34%|###3 | 38/113 [00:00<00:00, 175.51it/s]
Ho-Nd @ 14 rows : 34%|###3 | 38/113 [00:00<00:00, 175.51it/s]
Ho-Sm @ 14 rows : 34%|###3 | 38/113 [00:00<00:00, 175.51it/s]
Ho-Eu @ 4 rows : 34%|###3 | 38/113 [00:00<00:00, 175.51it/s]
Ho-Gd @ 14 rows : 34%|###3 | 38/113 [00:00<00:00, 175.51it/s]
Ho-Tb @ 2 rows : 34%|###3 | 38/113 [00:00<00:00, 175.51it/s]
Ho-Dy @ 14 rows : 34%|###3 | 38/113 [00:00<00:00, 175.51it/s]
Ho-Ho @ 2 rows : 34%|###3 | 38/113 [00:00<00:00, 175.51it/s]
Er-O @ 36 rows : 34%|###3 | 38/113 [00:00<00:00, 175.51it/s]
Er-O @ 36 rows : 50%|####9 | 56/113 [00:00<00:00, 175.60it/s]
Er-H @ 24 rows : 50%|####9 | 56/113 [00:00<00:00, 175.60it/s]
Er-N @ 24 rows : 50%|####9 | 56/113 [00:00<00:00, 175.60it/s]
Er-La @ 24 rows : 50%|####9 | 56/113 [00:00<00:00, 175.60it/s]
Er-Ce @ 48 rows : 50%|####9 | 56/113 [00:00<00:00, 175.60it/s]
Er-Pr @ 12 rows : 50%|####9 | 56/113 [00:00<00:00, 175.60it/s]
Er-Nd @ 84 rows : 50%|####9 | 56/113 [00:00<00:00, 175.60it/s]
Er-Sm @ 84 rows : 50%|####9 | 56/113 [00:00<00:00, 175.60it/s]
Er-Eu @ 24 rows : 50%|####9 | 56/113 [00:00<00:00, 175.60it/s]
Er-Gd @ 84 rows : 50%|####9 | 56/113 [00:00<00:00, 175.60it/s]
Er-Tb @ 12 rows : 50%|####9 | 56/113 [00:00<00:00, 175.60it/s]
Er-Dy @ 84 rows : 50%|####9 | 56/113 [00:00<00:00, 175.60it/s]
Er-Ho @ 12 rows : 50%|####9 | 56/113 [00:00<00:00, 175.60it/s]
Er-Er @ 42 rows : 50%|####9 | 56/113 [00:00<00:00, 175.60it/s]
Tm-O @ 6 rows : 50%|####9 | 56/113 [00:00<00:00, 175.60it/s]
Tm-H @ 4 rows : 50%|####9 | 56/113 [00:00<00:00, 175.60it/s]
Tm-N @ 4 rows : 50%|####9 | 56/113 [00:00<00:00, 175.60it/s]
Tm-La @ 4 rows : 50%|####9 | 56/113 [00:00<00:00, 175.60it/s]
Tm-Ce @ 8 rows : 50%|####9 | 56/113 [00:00<00:00, 175.60it/s]
Tm-Ce @ 8 rows : 65%|######5 | 74/113 [00:00<00:00, 172.37it/s]
Tm-Pr @ 2 rows : 65%|######5 | 74/113 [00:00<00:00, 172.37it/s]
Tm-Nd @ 14 rows : 65%|######5 | 74/113 [00:00<00:00, 172.37it/s]
Tm-Sm @ 14 rows : 65%|######5 | 74/113 [00:00<00:00, 172.37it/s]
Tm-Eu @ 4 rows : 65%|######5 | 74/113 [00:00<00:00, 172.37it/s]
Tm-Gd @ 14 rows : 65%|######5 | 74/113 [00:00<00:00, 172.37it/s]
Tm-Tb @ 2 rows : 65%|######5 | 74/113 [00:00<00:00, 172.37it/s]
Tm-Dy @ 14 rows : 65%|######5 | 74/113 [00:00<00:00, 172.37it/s]
Tm-Ho @ 2 rows : 65%|######5 | 74/113 [00:00<00:00, 172.37it/s]
Tm-Er @ 12 rows : 65%|######5 | 74/113 [00:00<00:00, 172.37it/s]
Tm-Tm @ 2 rows : 65%|######5 | 74/113 [00:00<00:00, 172.37it/s]
Yb-H @ 28 rows : 65%|######5 | 74/113 [00:00<00:00, 172.37it/s]
Yb-La @ 28 rows : 65%|######5 | 74/113 [00:00<00:00, 172.37it/s]
Yb-Ce @ 56 rows : 65%|######5 | 74/113 [00:00<00:00, 172.37it/s]
Yb-Pr @ 14 rows : 65%|######5 | 74/113 [00:00<00:00, 172.37it/s]
Yb-Nd @ 98 rows : 65%|######5 | 74/113 [00:00<00:00, 172.37it/s]
Yb-Sm @ 98 rows : 65%|######5 | 74/113 [00:00<00:00, 172.37it/s]
Yb-Eu @ 28 rows : 65%|######5 | 74/113 [00:00<00:00, 172.37it/s]
Yb-Gd @ 98 rows : 65%|######5 | 74/113 [00:00<00:00, 172.37it/s]
Yb-Gd @ 98 rows : 81%|########1 | 92/113 [00:00<00:00, 171.63it/s]
Yb-Tb @ 14 rows : 81%|########1 | 92/113 [00:00<00:00, 171.63it/s]
Yb-Dy @ 98 rows : 81%|########1 | 92/113 [00:00<00:00, 171.63it/s]
Yb-Ho @ 14 rows : 81%|########1 | 92/113 [00:00<00:00, 171.63it/s]
Yb-Er @ 84 rows : 81%|########1 | 92/113 [00:00<00:00, 171.63it/s]
Yb-Tm @ 14 rows : 81%|########1 | 92/113 [00:00<00:00, 171.63it/s]
Yb-Yb @ 56 rows : 81%|########1 | 92/113 [00:00<00:00, 171.63it/s]
Lu-H @ 8 rows : 81%|########1 | 92/113 [00:00<00:00, 171.63it/s]
Lu-La @ 8 rows : 81%|########1 | 92/113 [00:00<00:00, 171.63it/s]
Lu-Ce @ 16 rows : 81%|########1 | 92/113 [00:00<00:00, 171.63it/s]
Lu-Pr @ 4 rows : 81%|########1 | 92/113 [00:00<00:00, 171.63it/s]
Lu-Nd @ 28 rows : 81%|########1 | 92/113 [00:00<00:00, 171.63it/s]
Lu-Sm @ 28 rows : 81%|########1 | 92/113 [00:00<00:00, 171.63it/s]
Lu-Eu @ 8 rows : 81%|########1 | 92/113 [00:00<00:00, 171.63it/s]
Lu-Gd @ 28 rows : 81%|########1 | 92/113 [00:00<00:00, 171.63it/s]
Lu-Tb @ 4 rows : 81%|########1 | 92/113 [00:00<00:00, 171.63it/s]
Lu-Dy @ 28 rows : 81%|########1 | 92/113 [00:00<00:00, 171.63it/s]
Lu-Ho @ 4 rows : 81%|########1 | 92/113 [00:00<00:00, 171.63it/s]
Lu-Er @ 24 rows : 81%|########1 | 92/113 [00:00<00:00, 171.63it/s]
Lu-Er @ 24 rows : 97%|#########7| 110/113 [00:00<00:00, 171.36it/s]
Lu-Tm @ 4 rows : 97%|#########7| 110/113 [00:00<00:00, 171.36it/s]
Lu-Yb @ 28 rows : 97%|#########7| 110/113 [00:00<00:00, 171.36it/s]
Lu-Lu @ 6 rows : 97%|#########7| 110/113 [00:00<00:00, 171.36it/s]
Lu-Lu @ 6 rows : 100%|##########| 113/113 [00:00<00:00, 173.21it/s]
From this table, we can create our plot, here limiting the labelling to the five peaks with highest estimated intensity:

Out:
/home/docs/checkouts/readthedocs.org/user_builds/interferences/envs/latest/lib/python3.7/site-packages/numpy/core/fromnumeric.py:43: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.
result = getattr(asarray(obj), method)(*args, **kwds)
While the production of the doubly-charged double-REE ions is likely less significant than shown here (no penalisation for higher charges/larger molecules is included in generating these spectra), we can see that \(\mathrm{^{153}Eu^{16}O}\) could be a potential interference issue if the conditions are relatively oxidised, and if there’s sufficient hydrogen, \(\mathrm{^{168}Er^{1}H}\) may similarly contribute to problems.
Notably, there’s a number of other potential ions in vicinity of \(\mathrm{^{169}Tm}\). However, most of these are doubly-charged double-REE ions. Given the highly-correlated nature of the REE, these may not pose as significant issues for standardisation as the hydride and oxide ions.
Total running time of the script: ( 0 minutes 7.653 seconds)