-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Multidimensional groupby #818
Merged
Merged
Changes from all commits
Commits
Show all changes
10 commits
Select commit
Hold shift + click to select a range
f5f69b8
multidimensional groupby and binning
rabernat 4c65a71
added time dimension to multidim groupby tests
rabernat 016071c
updated docs
rabernat e879e8c
fixed binning
rabernat 82e4878
add groupby_bins method
rabernat b94f1b8
doc update
rabernat d614246
test for non-monotonic 2d coordinates
rabernat f957eb8
bin coordinate name changed
rabernat 237fc39
updated docs and example
rabernat dc50064
fixed style issues and whats-new
rabernat File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,3 +7,4 @@ Examples | |
examples/quick-overview | ||
examples/weather-data | ||
examples/monthly-means | ||
examples/multidimensional-coords |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,201 @@ | ||
.. _examples.multidim: | ||
|
||
Working with Multidimensional Coordinates | ||
========================================= | ||
|
||
Author: `Ryan Abernathey <http://github.org/rabernat>`__ | ||
|
||
Many datasets have *physical coordinates* which differ from their | ||
*logical coordinates*. Xarray provides several ways to plot and analyze | ||
such datasets. | ||
|
||
.. code:: python | ||
|
||
%matplotlib inline | ||
import numpy as np | ||
import pandas as pd | ||
import xarray as xr | ||
import cartopy.crs as ccrs | ||
from matplotlib import pyplot as plt | ||
|
||
print("numpy version : ", np.__version__) | ||
print("pandas version : ", pd.__version__) | ||
print("xarray version : ", xr.version.version) | ||
|
||
|
||
.. parsed-literal:: | ||
|
||
('numpy version : ', '1.11.0') | ||
('pandas version : ', u'0.18.0') | ||
('xarray version : ', '0.7.2-32-gf957eb8') | ||
|
||
|
||
As an example, consider this dataset from the | ||
`xarray-data <https://github.com/pydata/xarray-data>`__ repository. | ||
|
||
.. code:: python | ||
|
||
! curl -L -O https://github.com/pydata/xarray-data/raw/master/RASM_example_data.nc | ||
|
||
.. code:: python | ||
|
||
ds = xr.open_dataset('RASM_example_data.nc') | ||
ds | ||
|
||
|
||
|
||
|
||
.. parsed-literal:: | ||
|
||
<xarray.Dataset> | ||
Dimensions: (time: 36, x: 275, y: 205) | ||
Coordinates: | ||
* time (time) datetime64[ns] 1980-09-16T12:00:00 1980-10-17 ... | ||
yc (y, x) float64 16.53 16.78 17.02 17.27 17.51 17.76 18.0 18.25 ... | ||
xc (y, x) float64 189.2 189.4 189.6 189.7 189.9 190.1 190.2 190.4 ... | ||
* x (x) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... | ||
* y (y) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... | ||
Data variables: | ||
Tair (time, y, x) float64 nan nan nan nan nan nan nan nan nan nan ... | ||
Attributes: | ||
title: /workspace/jhamman/processed/R1002RBRxaaa01a/lnd/temp/R1002RBRxaaa01a.vic.ha.1979-09-01.nc | ||
institution: U.W. | ||
source: RACM R1002RBRxaaa01a | ||
output_frequency: daily | ||
output_mode: averaged | ||
convention: CF-1.4 | ||
references: Based on the initial model of Liang et al., 1994, JGR, 99, 14,415- 14,429. | ||
comment: Output from the Variable Infiltration Capacity (VIC) model. | ||
nco_openmp_thread_number: 1 | ||
NCO: 4.3.7 | ||
history: history deleted for brevity | ||
|
||
|
||
|
||
In this example, the *logical coordinates* are ``x`` and ``y``, while | ||
the *physical coordinates* are ``xc`` and ``yc``, which represent the | ||
latitudes and longitude of the data. | ||
|
||
.. code:: python | ||
|
||
print(ds.xc.attrs) | ||
print(ds.yc.attrs) | ||
|
||
|
||
.. parsed-literal:: | ||
|
||
OrderedDict([(u'long_name', u'longitude of grid cell center'), (u'units', u'degrees_east'), (u'bounds', u'xv')]) | ||
OrderedDict([(u'long_name', u'latitude of grid cell center'), (u'units', u'degrees_north'), (u'bounds', u'yv')]) | ||
|
||
|
||
Plotting | ||
-------- | ||
|
||
Let's examine these coordinate variables by plotting them. | ||
|
||
.. code:: python | ||
|
||
fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(14,4)) | ||
ds.xc.plot(ax=ax1) | ||
ds.yc.plot(ax=ax2) | ||
|
||
|
||
|
||
|
||
.. parsed-literal:: | ||
|
||
<matplotlib.collections.QuadMesh at 0x118688fd0> | ||
|
||
|
||
|
||
.. parsed-literal:: | ||
|
||
/Users/rpa/anaconda/lib/python2.7/site-packages/matplotlib/collections.py:590: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison | ||
if self._edgecolors == str('face'): | ||
|
||
|
||
|
||
.. image:: multidimensional_coords_files/xarray_multidimensional_coords_8_2.png | ||
|
||
|
||
Note that the variables ``xc`` (longitude) and ``yc`` (latitude) are | ||
two-dimensional scalar fields. | ||
|
||
If we try to plot the data variable ``Tair``, by default we get the | ||
logical coordinates. | ||
|
||
.. code:: python | ||
|
||
ds.Tair[0].plot() | ||
|
||
|
||
|
||
|
||
.. parsed-literal:: | ||
|
||
<matplotlib.collections.QuadMesh at 0x11b6da890> | ||
|
||
|
||
|
||
|
||
.. image:: multidimensional_coords_files/xarray_multidimensional_coords_10_1.png | ||
|
||
|
||
In order to visualize the data on a conventional latitude-longitude | ||
grid, we can take advantage of xarray's ability to apply | ||
`cartopy <http://scitools.org.uk/cartopy/index.html>`__ map projections. | ||
|
||
.. code:: python | ||
|
||
plt.figure(figsize=(14,6)) | ||
ax = plt.axes(projection=ccrs.PlateCarree()) | ||
ax.set_global() | ||
ds.Tair[0].plot.pcolormesh(ax=ax, transform=ccrs.PlateCarree(), x='xc', y='yc', add_colorbar=False) | ||
ax.coastlines() | ||
ax.set_ylim([0,90]); | ||
|
||
|
||
|
||
.. image:: multidimensional_coords_files/xarray_multidimensional_coords_12_0.png | ||
|
||
|
||
Multidimensional Groupby | ||
------------------------ | ||
|
||
The above example allowed us to visualize the data on a regular | ||
latitude-longitude grid. But what if we want to do a calculation that | ||
involves grouping over one of these physical coordinates (rather than | ||
the logical coordinates), for example, calculating the mean temperature | ||
at each latitude. This can be achieved using xarray's ``groupby`` | ||
function, which accepts multidimensional variables. By default, | ||
``groupby`` will use every unique value in the variable, which is | ||
probably not what we want. Instead, we can use the ``groupby_bins`` | ||
function to specify the output coordinates of the group. | ||
|
||
.. code:: python | ||
|
||
# define two-degree wide latitude bins | ||
lat_bins = np.arange(0,91,2) | ||
# define a label for each bin corresponding to the central latitude | ||
lat_center = np.arange(1,90,2) | ||
# group according to those bins and take the mean | ||
Tair_lat_mean = ds.Tair.groupby_bins('xc', lat_bins, labels=lat_center).mean() | ||
# plot the result | ||
Tair_lat_mean.plot() | ||
|
||
|
||
|
||
|
||
.. parsed-literal:: | ||
|
||
[<matplotlib.lines.Line2D at 0x11cb92e90>] | ||
|
||
|
||
|
||
|
||
.. image:: multidimensional_coords_files/xarray_multidimensional_coords_14_1.png | ||
|
||
|
||
Note that the resulting coordinate for the ``groupby_bins`` operation | ||
got the ``_bins`` suffix appended: ``xc_bins``. This help us distinguish | ||
it from the original multidimensional variable ``xc``. |
Binary file added
BIN
+54.2 KB
doc/examples/multidimensional_coords_files/xarray_multidimensional_coords_10_1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+104 KB
doc/examples/multidimensional_coords_files/xarray_multidimensional_coords_12_0.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+9.04 KB
doc/examples/multidimensional_coords_files/xarray_multidimensional_coords_14_1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+56.8 KB
doc/examples/multidimensional_coords_files/xarray_multidimensional_coords_8_2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Note that...