Plotting
Note
Added in version 1.0.3.
All standard measurements have a Plot()
which will generate a plot of the calculated method.
These plots are based on the matplotlib package.
Note
Specifying name
will save the figure under the given string. For example .Plot(name='myplot.png')
Added in version 1.1.0.
Plotting theoretical calculations
First, we calculate an AmplitudeSpectrum
with a linear polarized beam and plot it.
import nexus as nx
import numpy as np
site = nx.Hyperfine(magnetic_field = 33,
isotropic = True)
iron = nx.Material.Template(nx.lib.material.Fe)
iron.hyperfine_sites = [site]
layer_Fe = nx.Layer(id = "Fe layer",
material = iron,
thickness = 3000)
sample = nx.Sample(layers = [layer_Fe])
beam = nx.Beam()
beam.LinearSigma()
exp = nx.Experiment(beam = beam,
objects = [sample],
isotope = nx.lib.moessbauer.Fe57)
detuning = np.linspace(-200, 200, 1001)
amp_spectrum = nx.AmplitudeSpectrum(experiment = exp,
detuning = detuning,
electronic = False,
id = "my amplitude spectrum")
amp = amp_spectrum.Calculate()
# with all options
amp_spectrum.Plot(sigma=True,
pi=True,
polar=False,
unwrap=True)
Plotting data and fits
When you want to plot measured data and the corresponding fits, there are severla options to change the plot style.
Here we give examples for the EnergySpectrum
and TimeSpectrum
methods.
Energy and Moessbauer Spectra
Let us use the fit example from the Hello Nexus section.
import nexus as nx
import numpy as np
data = np.loadtxt('example_spectrum.txt')
velocity_experiment = data[:,0]
intensity_experiment = data[:,1]
site = nx.Hyperfine(magnetic_field = nx.Var(value = 31, min = 25, max = 35, fit = True, id = "magnetic field"),
isotropic = True)
mat_Fe = nx.Material.Template(nx.lib.material.Fe)
mat_Fe.hyperfine_sites = [site]
layer_Fe = nx.Layer(id = "Fe",
material = mat_Fe,
thickness = 3000)
sample = nx.Sample(layers = [layer_Fe])
beam = nx.Beam()
beam.Unpolarized()
exp = nx.Experiment(beam = beam,
objects = [sample],
isotope = nx.lib.moessbauer.Fe57)
spectrum = nx.MoessbauerSpectrum(experiment = exp,
velocity = velocity_experiment, # the measured velocity
intensity_data = intensity_experiment) # the measured intensity to be fit
intensity = spectrum.Calculate()
spectrum.Plot(velocity = True)
Fit the data
fit = nx.Fit(measurements = [spectrum])
fit.Evaluate()
and plot.
Here you can also see all options for a EnergySpectrum
plot, which are in matplotlib style.
spectrum.Plot(data=True,
residuals=True,
velocity=True,
datacolor='black',
theorycolor='r',
theorywidth=2,
datalinestyle='none',
datamarker='+',
datamarkersize=2,
datafillstyle='full',
legend=True,
errors=False,
errorcap=2)
Time Spectrum
Here’s an example on how to use the Plot()
method for a TimeSpectrum
.
import nexus as nx
import numpy as np
site = nx.Hyperfine(magnetic_field = 33,
magnetic_theta = 90,
magnetic_phi = 0,
isotropic = False)
iron = nx.Material.Template(nx.lib.material.Fe)
iron.hyperfine_sites = [site]
layer_Fe = nx.Layer(id = "Fe layer",
material = iron,
thickness = 3000)
sample = nx.Sample(layers = [layer_Fe])
beam = nx.Beam()
beam.LinearSigma()
exp = nx.Experiment(beam = beam,
objects = [sample],
isotope = nx.lib.moessbauer.Fe57)
time_spectrum = nx.TimeSpectrum(experiment = exp,
time_length = 200,
time_step = 0.5,
bunch_spacing = 192.2, # PETRA III bunch spacing
id = "my time spectrum")
time, intensity = time_spectrum.Calculate()
Now we just use the plot method
time_spectrum.Plot()
For plot demonstration purposes, we use this spectrum and try to fit it. Therefore we scale it to get to values larger then one and make it integer values, as a real histogram would have.
intensity = np.round(1e5* intensity)
and use this as a data set to be fit
time_spectrum_2 = nx.TimeSpectrum(experiment = exp,
time_data = time,
intensity_data = intensity,
time_length = 200,
time_step = 0.2,
bunch_spacing = 192.2, # PETRA III bunch spacing
id = "my time spectrum")
time_spectrum_2.Calculate()
# plot with error bars in intensity_data
time_spectrum_2.Plot(errors=True)
This time we fit with the gradient free local optimization method Subplex
.
fit = nx.Fit([time_spectrum_2])
fit.options.method = "Subplex"
fit()
and plot the result.
Here you can also see all options for a TimeSpectrum
plot.
time_spectrum_2.Plot(data=True,
residuals=True,
errors=True,
datacolor='black',
theorycolor='r',
theorywidth=2,
datalinestyle='none',
datamarker='+',
datamarkersize=2,
datafillstyle='full',
legend=True)
Notebooks
plot amplitude spectrum - nb_plot_amplitude_spectrum.ipynb
.
plot moessbauer spectrum - nb_plot_moessbauer_spectrum.ipynb
.
plot time spectrum - nb_plot_time_spectrum.ipynb
.
Please have a look to the API Reference for more information.