From ea46f8630dbaba399c1368ed1f15752542fa0e6f Mon Sep 17 00:00:00 2001 From: Thomas Nicholas Date: Wed, 8 Aug 2018 00:15:20 -0700 Subject: [PATCH] Added outline of convenience function which accepts an xarray DataArray and plots an animated plot using imshow. Also included an example script and the output. --- animatplot/__init__.py | 1 + animatplot/examples/__init__.py | 0 animatplot/examples/xanim/__init__.py | 0 animatplot/examples/xanim/imshow.py | 21 +++++++++ animatplot/examples/xarray_imshow.gif | Bin 0 -> 70760 bytes animatplot/xanim.py | 61 ++++++++++++++++++++++++++ 6 files changed, 83 insertions(+) create mode 100644 animatplot/examples/__init__.py create mode 100644 animatplot/examples/xanim/__init__.py create mode 100644 animatplot/examples/xanim/imshow.py create mode 100644 animatplot/examples/xarray_imshow.gif create mode 100644 animatplot/xanim.py diff --git a/animatplot/__init__.py b/animatplot/__init__.py index 06ffa3a..fa99c80 100644 --- a/animatplot/__init__.py +++ b/animatplot/__init__.py @@ -2,3 +2,4 @@ from .timeline import Timeline from .animations.animation import Animation from . import blocks, util +from . import xanim diff --git a/animatplot/examples/__init__.py b/animatplot/examples/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/animatplot/examples/xanim/__init__.py b/animatplot/examples/xanim/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/animatplot/examples/xanim/imshow.py b/animatplot/examples/xanim/imshow.py new file mode 100644 index 0000000..6fb9b45 --- /dev/null +++ b/animatplot/examples/xanim/imshow.py @@ -0,0 +1,21 @@ +import numpy as np +import xarray as xr +import matplotlib.pyplot as plt +from animatplot.xanim import animated_plot + + +# Create data set +x = np.linspace(-2, 2, 41) +y = np.linspace(-2, 2, 41) +t = np.linspace(0, 2*np.pi, 30) +X, Y, T = np.meshgrid(x, y, t) +data = np.sin(X*X+Y*Y-T) +da = xr.DataArray(data, coords=[('horizontal position', x), + ('vertical position', y), + ('time', t)]) + +# Create animated 2D plot +anim, block, timeline = animated_plot(da) +anim.controls() +anim.save_gif('../xarray_imshow') +plt.show() diff --git a/animatplot/examples/xarray_imshow.gif b/animatplot/examples/xarray_imshow.gif new file mode 100644 index 0000000000000000000000000000000000000000..352e633893b95e49fe23b6cc6813b08941aa50af GIT binary patch literal 70760 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 literal 0 HcmV?d00001 diff --git a/animatplot/xanim.py b/animatplot/xanim.py new file mode 100644 index 0000000..e3938a5 --- /dev/null +++ b/animatplot/xanim.py @@ -0,0 +1,61 @@ +import animatplot as amp +import xarray as xr + + +def animated_plot(da, anim_over='__guess__', x='x', y='y', plot_type='imshow', fps=10): + """ + Function to plot an animated plot from an xarray DataArray. + + The intention is that this would form the basis of a xr.DataArray.plot.animate() method. + """ + + if not isinstance(da, xr.DataArray): + raise TypeError('First argument must be an xarray DataArray object') + + timeline, evolving_coord = _timeline_from_coords(da.coords, anim_over, fps) + t_axis = da.dims.index(evolving_coord) + + if len(da.dims) is not 3: + raise NotImplementedError('Currently only plots 2D dataarrays') + + if plot_type is 'imshow': + # TODO ideally the blocks method should call the xarray plotting method da.plot.imshow() + print(da.values.shape) + print(t_axis) + block = amp.blocks.Imshow(da.values, t_axis=t_axis) + else: + # TODO deal with other kinds of plot (lines, quiver...) here + raise NotImplementedError('Currently only plots using imshow') + + # TODO if we can't call the xarray plotting method directly then add titles, axes labels etc here + anim = amp.Animation([block]) + + return anim, block, timeline + + +def _timeline_from_coords(coords, anim_over, fps): + """Create the animatplot Timeline object from the information in the coordinates attribute of the DataArray.""" + + # Determine coordinate over which plot should be animated + if anim_over is '__guess__': + # Attempt to automatically determine coordinate over which to animate plot + guesses = {'t', 'T', 'time', 'Time'} + matches = list(guesses & set(coords)) + if len(matches) is 1: + evolving_coord = matches[0] + else: + raise ValueError('Could not automatically determine coordinate to animate over - ' + 'multiple possibilities found: ' + str(matches)) + elif anim_over in coords: + evolving_coord = anim_over + else: + raise ValueError('Could not determine coordinate to animate over') + + print(evolving_coord) + t = coords[evolving_coord].values + + # TODO Attempt to determine units from metadata in dataarray attributes, according to CF conventions + + timeline = amp.Timeline(t, units=None, fps=fps) + + return timeline, evolving_coord