# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-
# vi: set ft=python sts=4 ts=4 sw=4 et:
''' plot tsdiffana parameters '''
from __future__ import absolute_import
import numpy as np
import nipy
from .timediff import time_slice_diffs
from nipy.externals.six import string_types
[docs]def plot_tsdiffs(results, axes=None):
''' Plotting routine for time series difference metrics
Requires matplotlib
Parameters
----------
results : dict
Results of format returned from
:func:`nipy.algorithms.diagnostics.time_slice_diff`
'''
import matplotlib.pyplot as plt
T = len(results['volume_means'])
S = results['slice_mean_diff2'].shape[1]
mean_means = np.mean(results['volume_means'])
scaled_slice_diff = results['slice_mean_diff2'] / mean_means
if axes is None:
n_plots = 4
fig = plt.figure()
fig.set_size_inches([10,10])
axes = [plt.subplot(n_plots, 1, i+1) for i in range(n_plots)]
def xmax_labels(ax, val, xlabel, ylabel):
xlims = ax.axis()
ax.axis((0, val) + xlims[2:])
ax.set_xlabel(xlabel)
ax.set_ylabel(ylabel)
# plot of mean volume variance
ax = axes[0]
ax.plot(results['volume_mean_diff2'] / mean_means)
xmax_labels(ax, T-1, 'Difference image number', 'Scaled variance')
# plot of diff by slice
ax = axes[1]
#Set up the color map for the different slices:
X, Y = np.meshgrid(np.arange(scaled_slice_diff.shape[0]),
np.arange(scaled_slice_diff.shape[1]))
# Use HSV in order to code the slices from bottom to top:
ax.scatter(X.T.ravel(),scaled_slice_diff.ravel(),
c=Y.T.ravel(),cmap=plt.cm.hsv,
alpha=0.2)
xmax_labels(ax, T-1,
'Difference image number',
'Slice by slice variance')
# mean intensity
ax = axes[2]
ax.plot(results['volume_means'] / mean_means)
xmax_labels(ax, T,
'Image number',
'Scaled mean \n voxel intensity')
# slice plots min max mean
ax = axes[3]
ax.plot(np.mean(scaled_slice_diff, 0), 'k')
ax.plot(np.min(scaled_slice_diff, 0), 'b')
ax.plot(np.max(scaled_slice_diff, 0), 'r')
xmax_labels(ax, S+1,
'Slice number',
'Max/mean/min \n slice variation')
return axes
@np.deprecate_with_doc('Please see docstring for alternative code')
def plot_tsdiffs_image(img, axes=None, show=True):
''' Plot time series diagnostics for image
This function is deprecated; please use something like::
results = time_slice_diff_image(img, slice_axis=2)
plot_tsdiffs(results)
instead.
Parameters
----------
img : image-like or filename str
image on which to do diagnostics
axes : None or sequence, optional
Axes on which to plot the diagnostics. If None, then we create a figure
and subplots for the plots. Sequence should have length
>=4.
show : {True, False}, optional
If True, show the figure after plotting it
Returns
-------
axes : Matplotlib axes
Axes on which we have done the plots. Will be same as `axes` input if
`axes` input was not None
'''
if isinstance(img, string_types):
title = img
else:
title = 'Difference plots'
img = nipy.as_image(img)
res = time_slice_diffs(img)
axes = plot_tsdiffs(res, axes)
axes[0].set_title(title)
if show:
# show the plot
import matplotlib.pyplot as plt
plt.show()
return axes