You can run this notebook in a live session or view it on Github.

# Visualization Gallery

This notebook shows common visualization issues encountered in Xarray.

    [1]:

    import cartopy.crs as ccrs
    import matplotlib.pyplot as plt
    import xarray as xr
    %matplotlib inline

Load example dataset:

    [2]:

    ds = xr.tutorial.load_dataset('air_temperature')

    ---------------------------------------------------------------------------
    FileNotFoundError                         Traceback (most recent call last)
    <ipython-input-2-15c698672cac> in <module>
    ----> 1 ds = xr.tutorial.load_dataset('air_temperature')

    /build/python-xarray-kTVyut/python-xarray-0.15.0/xarray/tutorial.py in load_dataset(*args, **kwargs)
        111     open_dataset
        112     """
    --> 113     with open_dataset(*args, **kwargs) as ds:
        114         return ds.load()
        115

    /build/python-xarray-kTVyut/python-xarray-0.15.0/xarray/tutorial.py in open_dataset(name, cache, cache_dir, github_url, branch, **kws)
         76         # May want to add an option to remove it.
         77         if not _os.path.isdir(longdir):
    ---> 78             _os.mkdir(longdir)
         79
         80         url = "/".join((github_url, "raw", branch, fullname))

    FileNotFoundError: [Errno 2] No such file or directory: '/sbuild-nonexistent/.xarray_tutorial_data'

## Multiple plots and map projections

Control the map projection parameters on multiple axes

This example illustrates how to plot multiple maps and control their extent and aspect ratio.

For more details see this discussion on github.

    [3]:

    air = ds.air.isel(time=[0, 724]) - 273.15

    # This is the map projection we want to plot *onto*
    map_proj = ccrs.LambertConformal(central_longitude=-95, central_latitude=45)

    p = air.plot(transform=ccrs.PlateCarree(),  # the data's projection
                 col='time', col_wrap=1,  # multiplot settings
                 aspect=ds.dims['lon'] / ds.dims['lat'],  # for a sensible figsize
                 subplot_kws={'projection': map_proj})  # the plot's projection

    # We have to set the map's options on all axes
    for ax in p.axes.flat:
        ax.coastlines()
        ax.set_extent([-160, -30, 5, 75])

    ---------------------------------------------------------------------------
    NameError                                 Traceback (most recent call last)
    <ipython-input-3-91c1107c19c0> in <module>
    ----> 1 air = ds.air.isel(time=[0, 724]) - 273.15
          2
          3 # This is the map projection we want to plot *onto*
          4 map_proj = ccrs.LambertConformal(central_longitude=-95, central_latitude=45)
          5

    NameError: name 'ds' is not defined

## Centered colormaps

Xarray’s automatic colormaps choice

    [4]:

    air = ds.air.isel(time=0)

    f, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(8, 6))

    # The first plot (in kelvins) chooses "viridis" and uses the data's min/max
    air.plot(ax=ax1, cbar_kwargs={'label': 'K'})
    ax1.set_title('Kelvins: default')
    ax2.set_xlabel('')

    # The second plot (in celsius) now chooses "BuRd" and centers min/max around 0
    airc = air - 273.15
    airc.plot(ax=ax2, cbar_kwargs={'label': '°C'})
    ax2.set_title('Celsius: default')
    ax2.set_xlabel('')
    ax2.set_ylabel('')

    # The center doesn't have to be 0
    air.plot(ax=ax3, center=273.15, cbar_kwargs={'label': 'K'})
    ax3.set_title('Kelvins: center=273.15')

    # Or it can be ignored
    airc.plot(ax=ax4, center=False, cbar_kwargs={'label': '°C'})
    ax4.set_title('Celsius: center=False')
    ax4.set_ylabel('')

    # Make it nice
    plt.tight_layout()

    ---------------------------------------------------------------------------
    NameError                                 Traceback (most recent call last)
    <ipython-input-4-13691d1c0109> in <module>
    ----> 1 air = ds.air.isel(time=0)
          2
          3 f, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(8, 6))
          4
          5 # The first plot (in kelvins) chooses "viridis" and uses the data's min/max

    NameError: name 'ds' is not defined

## Control the plot’s colorbar

Use `cbar_kwargs` keyword to specify the number of ticks. The `spacing` kwarg can be used to draw proportional ticks.

    [5]:

    air2d = ds.air.isel(time=500)

    # Prepare the figure
    f, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(14, 4))

    # Irregular levels to illustrate the use of a proportional colorbar
    levels = [245, 250, 255, 260, 265, 270, 275, 280, 285, 290, 310, 340]

    # Plot data
    air2d.plot(ax=ax1, levels=levels)
    air2d.plot(ax=ax2, levels=levels, cbar_kwargs={'ticks': levels})
    air2d.plot(ax=ax3, levels=levels, cbar_kwargs={'ticks': levels,
                                                   'spacing': 'proportional'})

    # Show plots
    plt.tight_layout()

    ---------------------------------------------------------------------------
    NameError                                 Traceback (most recent call last)
    <ipython-input-5-eefd6d2158f3> in <module>
    ----> 1 air2d = ds.air.isel(time=500)
          2
          3 # Prepare the figure
          4 f, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(14, 4))
          5

    NameError: name 'ds' is not defined

## Multiple lines from a 2d DataArray

Use `xarray.plot.line` on a 2d DataArray to plot selections as multiple lines.

See `plotting.multiplelines` for more details.

    [6]:

    air = ds.air - 273.15  # to celsius

    # Prepare the figure
    f, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4), sharey=True)

    # Selected latitude indices
    isel_lats = [10, 15, 20]

    # Temperature vs longitude plot - illustrates the "hue" kwarg
    air.isel(time=0, lat=isel_lats).plot.line(ax=ax1, hue='lat')
    ax1.set_ylabel('°C')

    # Temperature vs time plot - illustrates the "x" and "add_legend" kwargs
    air.isel(lon=30, lat=isel_lats).plot.line(ax=ax2, x='time', add_legend=False)
    ax2.set_ylabel('')

    # Show
    plt.tight_layout()

    ---------------------------------------------------------------------------
    NameError                                 Traceback (most recent call last)
    <ipython-input-6-2c471b645252> in <module>
    ----> 1 air = ds.air - 273.15  # to celsius
          2
          3 # Prepare the figure
          4 f, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4), sharey=True)
          5

    NameError: name 'ds' is not defined

## `imshow()` and rasterio map projections

Using rasterio’s projection information for more accurate plots.

This example extends `recipes.rasterio` and plots the image in the original map projection instead of relying on pcolormesh and a map transformation.

    [7]:

    url = 'https://github.com/mapbox/rasterio/raw/master/tests/data/RGB.byte.tif'
    da = xr.open_rasterio(url)

    # The data is in UTM projection. We have to set it manually until
    # https://github.com/SciTools/cartopy/issues/813 is implemented
    crs = ccrs.UTM('18N')

    # Plot on a map
    ax = plt.subplot(projection=crs)
    da.plot.imshow(ax=ax, rgb='band', transform=crs)
    ax.coastlines('10m', color='r')

    ---------------------------------------------------------------------------
    KeyError                                  Traceback (most recent call last)
    /build/python-xarray-kTVyut/python-xarray-0.15.0/xarray/backends/file_manager.py in _acquire_with_cache_info(self, needs_lock)
        197             try:
    --> 198                 file = self._cache[self._key]
        199             except KeyError:

    /build/python-xarray-kTVyut/python-xarray-0.15.0/xarray/backends/lru_cache.py in __getitem__(self, key)
         52         with self._lock:
    ---> 53             value = self._cache[key]
         54             self._cache.move_to_end(key)

    KeyError: [<function open at 0x7f0b893aba60>, ('https://github.com/mapbox/rasterio/raw/master/tests/data/RGB.byte.tif',), 'r', ()]

    During handling of the above exception, another exception occurred:

    CPLE_HttpResponseError                    Traceback (most recent call last)
    rasterio/_base.pyx in rasterio._base.DatasetBase.__init__()

    rasterio/_shim.pyx in rasterio._shim.open_dataset()

    rasterio/_err.pyx in rasterio._err.exc_wrap_pointer()

    CPLE_HttpResponseError: CURL error: Could not resolve host: github.com

    During handling of the above exception, another exception occurred:

    RasterioIOError                           Traceback (most recent call last)
    <ipython-input-7-de06099ce2ea> in <module>
          1 url = 'https://github.com/mapbox/rasterio/raw/master/tests/data/RGB.byte.tif'
    ----> 2 da = xr.open_rasterio(url)
          3
          4 # The data is in UTM projection. We have to set it manually until
          5 # https://github.com/SciTools/cartopy/issues/813 is implemented

    /build/python-xarray-kTVyut/python-xarray-0.15.0/xarray/backends/rasterio_.py in open_rasterio(filename, parse_coordinates, chunks, cache, lock)
        237
        238     manager = CachingFileManager(rasterio.open, filename, lock=lock, mode="r")
    --> 239     riods = manager.acquire()
        240     if vrt_params is not None:
        241         riods = WarpedVRT(riods, **vrt_params)

    /build/python-xarray-kTVyut/python-xarray-0.15.0/xarray/backends/file_manager.py in acquire(self, needs_lock)
        178         An open file object, as returned by ``opener(*args, **kwargs)``.
        179         """
    --> 180         file, _ = self._acquire_with_cache_info(needs_lock)
        181         return file
        182

    /build/python-xarray-kTVyut/python-xarray-0.15.0/xarray/backends/file_manager.py in _acquire_with_cache_info(self, needs_lock)
        202                     kwargs = kwargs.copy()
        203                     kwargs["mode"] = self._mode
    --> 204                 file = self._opener(*self._args, **kwargs)
        205                 if self._mode == "w":
        206                     # ensure file doesn't get overriden when opened again

    /usr/lib/python3/dist-packages/rasterio/env.py in wrapper(*args, **kwds)
        432
        433         with env_ctor(session=session):
    --> 434             return f(*args, **kwds)
        435
        436     return wrapper

    /usr/lib/python3/dist-packages/rasterio/__init__.py in open(fp, mode, driver, width, height, count, crs, transform, dtype, nodata, sharing, **kwargs)
        217         # None.
        218         if mode == 'r':
    --> 219             s = DatasetReader(path, driver=driver, sharing=sharing, **kwargs)
        220         elif mode == 'r+':
        221             s = get_writer_for_path(path)(path, mode, driver=driver, sharing=sharing, **kwargs)

    rasterio/_base.pyx in rasterio._base.DatasetBase.__init__()

    RasterioIOError: CURL error: Could not resolve host: github.com

## Parsing rasterio geocoordinates

Converting a projection’s cartesian coordinates into 2D longitudes and latitudes.

These new coordinates might be handy for plotting and indexing, but it should be kept in mind that a grid which is regular in projection coordinates will likely be irregular in lon/lat. It is often recommended to work in the data’s original map projection (see `recipes.rasterio_rgb`).

    [8]:

    from rasterio.warp import transform
    import numpy as np

    url = 'https://github.com/mapbox/rasterio/raw/master/tests/data/RGB.byte.tif'
    da = xr.open_rasterio(url)

    # Compute the lon/lat coordinates with rasterio.warp.transform
    ny, nx = len(da['y']), len(da['x'])
    x, y = np.meshgrid(da['x'], da['y'])

    # Rasterio works with 1D arrays
    lon, lat = transform(da.crs, {'init': 'EPSG:4326'},
                         x.flatten(), y.flatten())
    lon = np.asarray(lon).reshape((ny, nx))
    lat = np.asarray(lat).reshape((ny, nx))
    da.coords['lon'] = (('y', 'x'), lon)
    da.coords['lat'] = (('y', 'x'), lat)

    # Compute a greyscale out of the rgb image
    greyscale = da.mean(dim='band')

    # Plot on a map
    ax = plt.subplot(projection=ccrs.PlateCarree())
    greyscale.plot(ax=ax, x='lon', y='lat', transform=ccrs.PlateCarree(),
                   cmap='Greys_r', add_colorbar=False)
    ax.coastlines('10m', color='r')

    ---------------------------------------------------------------------------
    KeyError                                  Traceback (most recent call last)
    /build/python-xarray-kTVyut/python-xarray-0.15.0/xarray/backends/file_manager.py in _acquire_with_cache_info(self, needs_lock)
        197             try:
    --> 198                 file = self._cache[self._key]
        199             except KeyError:

    /build/python-xarray-kTVyut/python-xarray-0.15.0/xarray/backends/lru_cache.py in __getitem__(self, key)
         52         with self._lock:
    ---> 53             value = self._cache[key]
         54             self._cache.move_to_end(key)

    KeyError: [<function open at 0x7f0b893aba60>, ('https://github.com/mapbox/rasterio/raw/master/tests/data/RGB.byte.tif',), 'r', ()]

    During handling of the above exception, another exception occurred:

    CPLE_OpenFailedError                      Traceback (most recent call last)
    rasterio/_base.pyx in rasterio._base.DatasetBase.__init__()

    rasterio/_shim.pyx in rasterio._shim.open_dataset()

    rasterio/_err.pyx in rasterio._err.exc_wrap_pointer()

    CPLE_OpenFailedError: '/vsicurl/https://github.com/mapbox/rasterio/raw/master/tests/data/RGB.byte.tif' does not exist in the file system, and is not recognized as a supported dataset name.

    During handling of the above exception, another exception occurred:

    RasterioIOError                           Traceback (most recent call last)
    <ipython-input-8-fec2e774fa84> in <module>
          3
          4 url = 'https://github.com/mapbox/rasterio/raw/master/tests/data/RGB.byte.tif'
    ----> 5 da = xr.open_rasterio(url)
          6
          7 # Compute the lon/lat coordinates with rasterio.warp.transform

    /build/python-xarray-kTVyut/python-xarray-0.15.0/xarray/backends/rasterio_.py in open_rasterio(filename, parse_coordinates, chunks, cache, lock)
        237
        238     manager = CachingFileManager(rasterio.open, filename, lock=lock, mode="r")
    --> 239     riods = manager.acquire()
        240     if vrt_params is not None:
        241         riods = WarpedVRT(riods, **vrt_params)

    /build/python-xarray-kTVyut/python-xarray-0.15.0/xarray/backends/file_manager.py in acquire(self, needs_lock)
        178         An open file object, as returned by ``opener(*args, **kwargs)``.
        179         """
    --> 180         file, _ = self._acquire_with_cache_info(needs_lock)
        181         return file
        182

    /build/python-xarray-kTVyut/python-xarray-0.15.0/xarray/backends/file_manager.py in _acquire_with_cache_info(self, needs_lock)
        202                     kwargs = kwargs.copy()
        203                     kwargs["mode"] = self._mode
    --> 204                 file = self._opener(*self._args, **kwargs)
        205                 if self._mode == "w":
        206                     # ensure file doesn't get overriden when opened again

    /usr/lib/python3/dist-packages/rasterio/env.py in wrapper(*args, **kwds)
        432
        433         with env_ctor(session=session):
    --> 434             return f(*args, **kwds)
        435
        436     return wrapper

    /usr/lib/python3/dist-packages/rasterio/__init__.py in open(fp, mode, driver, width, height, count, crs, transform, dtype, nodata, sharing, **kwargs)
        217         # None.
        218         if mode == 'r':
    --> 219             s = DatasetReader(path, driver=driver, sharing=sharing, **kwargs)
        220         elif mode == 'r+':
        221             s = get_writer_for_path(path)(path, mode, driver=driver, sharing=sharing, **kwargs)

    rasterio/_base.pyx in rasterio._base.DatasetBase.__init__()

    RasterioIOError: '/vsicurl/https://github.com/mapbox/rasterio/raw/master/tests/data/RGB.byte.tif' does not exist in the file system, and is not recognized as a supported dataset name.