Visualization
This visualization tutorial uses an instance tok
and sol
obtained by fitting the tutorial data according to
Getting Started.
Moment 0 map
Cube.moment0()
reutrns the moment-0 (integrated-flux) map of the
data cube. The best-fit model cube is stored in the tok
as
tok.modelcube
. We can visually compare the data and model using
tok.datacube
and tok.modelcube
.
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 3, figsize=[6.28 * 3, 6.28])
axes[0].imshow(tok.datacube.moment0(), origin='lower')
axes[1].imshow(tok.modelcube.moment0(), origin='lower')
axes[2].imshow(tok.datacube.moment0() - tok.modelcube.moment0(), origin='lower')

Moment 1 map
Similar to the moment-0 map, DataCube.pixmoment1()
reutrns the
moment-1 (velocity) map of the data cube.
import matplotlib.pyplot as plt
thresh = 3 * tok.datacube.rms_moment0()
v_center = np.nanmean(tok.datacube.pixmoment1(thresh=thresh))
m1_data = tok.datacube.pixmoment1(thresh=thresh) - v_center
m1_model = tok.modelcube.pixmoment1(thresh=thresh) - v_center
fig, axes = plt.subplots(1, 3, figsize=[6.28 * 3, 6.28])
axes[0].imshow(m1_data, origin='lower', cmap='coolwarm')
axes[1].imshow(m1_model, origin='lower', cmap='coolwarm')
axes[2].imshow(m1_data - m1_model, origin='lower', cmap='coolwarm')

Cube animation
There are several ways (including those not written in this section) to illustrate a 3D cube on python.
On the plot viewer, you can use matplotlib.pyplot.pause()
to make
animation of a 3D cube. This example shows the flux maps along the
velocity axis.
import matplotlib.pyplot as plt
interval = 0.05
vsize = tok.datacube.vlim[1] - tok.datacube.vlim[0]
data = tok.datacube.imageplane
fig = plt.figure()
for i in range(vsize):
plt.imshow(data[i, :, :], origin='lower', vmin=data.min(), vmax=data.max())
plt.pause(interval)
fig.clear()
plt.clf()
plt.clf()
plt.close()
To save the animation in a file, matplotlib.animation
is an option.
import matplotlib.pyplot as plt
import matplotlib.animation as animation
cube = tok.datacube.imageplane
vmin, vmax = cube.min(), cube.max()
fig = plt.figure(figsize=[6.28 * 0.7, 6.28 * 0.7])
ax = fig.add_subplot(1, 1, 1)
ims = []
for i in range(len(cube[:, 0, 0])):
im = ax.imshow(cube[i, :, :], vmin=vmin, vmax=vmax, origin='lower')
ims.append([im])
ani = animation.ArtistAnimation(
fig, ims, interval=300, blit=False, repeat_delay=1000, repeat=True
)
ani.save('anime_cube.gif', writer='pillow')
plt.close()

…why does this animation have so poor image quality?
Convergence of MCMC sampler
The MCMC sampler during the MCMC fitting are stored in the solution,
sol.sampler
. You can check whether the MCMC fiting is converged
using this attribute.
Note
Even if you performed fitting with the methods other than MCMC, there
exists sol.sampler
, but None
is stored.
This code plots the behavior of the nine parameters at each step.
import matplotlib.pyplot as plt
samples = sol.sampler.get_chain()
label = sol.best._fields
fig, axes = plt.subplots(9, 1, figsize=[6.28 * 1.5, 6.28 * 2])
for i in range(9):
axes[i].plot(samples[:, :, i])
axes[i].text(0.98, 0.95, label[i], ha='right', va='top', transform = axes[i].transAxes)
if i != 8:
axes[i].xaxis.set_ticklabels('')

Tokult implement emcee
as a MCMC sampler, so please see the
emcee
document for the details of how to manipulate the sampler.