Source code for resilientplotterclass.structured_data

import geopandas as gpd
import matplotlib.pyplot as plt
import numpy as np
from shapely.geometry import LineString, MultiLineString

import resilientplotterclass as rpc
from resilientplotterclass.geometries import _plot_gdf


[docs] def pcolormesh( da, ax=None, xy_unit=None, skip=1, smooth=1, xlim=None, ylim=None, xlabel_kwargs=None, ylabel_kwargs=None, title_kwargs=None, aspect_kwargs=None, grid_kwargs=None, append_axes_kwargs=None, **kwargs, ): """Plot data using pcolormesh. :param da: Data to plot. :type da: xarray.DataArray :param ax: Axis. :type ax: matplotlib.axes.Axes, optional :param xy_unit: Unit to rescale the x and y dimensions to. If ``None``, the unit is determined automatically based on the input data. :type xy_unit: str, optional :param skip: Plot every nth value in x and y direction. :type skip: int, optional :param smooth: Smooth data array with rolling mean in x and y direction. :type smooth: int, optional :param xlim: x limits. :type xlim: list[float], optional :param ylim: y limits. :type ylim: list[float], optional :param xlabel_kwargs: Keyword arguments for :func:`matplotlib.axis.set_xlabel`. :type xlabel_kwargs: dict, optional :param ylabel_kwargs: Keyword arguments for :func:`matplotlib.axis.set_ylabel`. :type ylabel_kwargs: dict, optional :param title_kwargs: Keyword arguments for :func:`matplotlib.axis.set_title`. :type title_kwargs: dict, optional :param aspect_kwargs: Keyword arguments for :func:`matplotlib.axis.set_aspect`. :type aspect_kwargs: dict, optional :param grid_kwargs: Keyword arguments for :func:`matplotlib.axis.grid`. :type grid_kwargs: dict, optional :param append_axes_kwargs: Keyword arguments for :func:`mpl_toolkits.axes_grid1.axes_divider.AxesDivider.append_axes`. :type append_axes_kwargs: dict, optional :param kwargs: Keyword arguments for :func:`xarray.plot.pcolormesh`. :type kwargs: dict, optional :return: Plot. :rtype: matplotlib.collections.QuadMesh :See also: `matplotlib.axis.set_xlabel <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_xlabel.html>`_, `matplotlib.axis.set_ylabel <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_ylabel.html>`_, `matplotlib.axis.set_title <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_title.html>`_, `matplotlib.axis.set_aspect <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_aspect.html>`_, `matplotlib.axis.grid <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.grid.html>`_, `mpl_toolkits.axes_grid1.axes_divider.AxesDivider.append_axes <https://matplotlib.org/stable/api/_as_gen/mpl_toolkits.axes_grid1.axes_divider.AxesDivider.html#mpl_toolkits.axes_grid1.axes_divider.AxesDivider.append_axes>`_, `xarray.plot.pcolormesh <http://xarray.pydata.org/en/stable/generated/xarray.plot.pcolormesh.html>`_. """ # Initialise axis if ax is None: _, ax = plt.subplots(1, 1, figsize=(10, 10)) # Get the rescale parameters scale_factor, _, _ = rpc.rescale.get_rescale_parameters(data=da, xy_unit=xy_unit) # Rescale the DataArray da = rpc.rescale.rescale(data=da, scale_factor=scale_factor) # Skip DataArray values if skip > 1: da = da.isel(x=slice(None, None, skip), y=slice(None, None, skip)) # Smooth DataArray if smooth > 1: da = da.rolling(x=smooth, center=True).mean().rolling(y=smooth, center=True).mean() # Append colorbar axis if append_axes_kwargs is not None and ("add_colorbar" not in kwargs or kwargs["add_colorbar"]): kwargs["cbar_kwargs"] = {} if "cbar_kwargs" not in kwargs or kwargs["cbar_kwargs"] is None else kwargs["cbar_kwargs"] kwargs["cbar_kwargs"]["cax"] = rpc.axes.append_cbar_axis(ax=ax, append_axes_kwargs=append_axes_kwargs) # Plot DataArray p = da.plot.pcolormesh(ax=ax, **kwargs) # Format axis ax = rpc.axes.format( ax=ax, data=da, xy_unit=xy_unit, xlim=xlim, ylim=ylim, xlabel_kwargs=xlabel_kwargs, ylabel_kwargs=ylabel_kwargs, title_kwargs=title_kwargs, aspect_kwargs=aspect_kwargs, grid_kwargs=grid_kwargs, ) # Return plot return p
[docs] def imshow( da, ax=None, xy_unit=None, skip=1, smooth=1, xlim=None, ylim=None, xlabel_kwargs=None, ylabel_kwargs=None, title_kwargs=None, aspect_kwargs=None, grid_kwargs=None, append_axes_kwargs=None, **kwargs, ): """Plot data using imshow. :param da: Data to plot. :type da: xarray.DataArray :param ax: Axis. :type ax: matplotlib.axes.Axes, optional :param xy_unit: Unit to rescale the x and y dimensions to. If ``None``, the unit is determined automatically based on the input data. :type xy_unit: str, optional :param skip: Plot every nth value in x and y direction. :type skip: int, optional :param smooth: Smooth data array with rolling mean in x and y direction. :type smooth: int, optional :param xlim: x limits. :type xlim: list[float], optional :param ylim: y limits. :type ylim: list[float], optional :param xlabel_kwargs: Keyword arguments for :func:`matplotlib.axis.set_xlabel`. :type xlabel_kwargs: dict, optional :param ylabel_kwargs: Keyword arguments for :func:`matplotlib.axis.set_ylabel`. :type ylabel_kwargs: dict, optional :param title_kwargs: Keyword arguments for :func:`matplotlib.axis.set_title`. :type title_kwargs: dict, optional :param aspect_kwargs: Keyword arguments for :func:`matplotlib.axis.set_aspect`. :type aspect_kwargs: dict, optional :param grid_kwargs: Keyword arguments for :func:`matplotlib.axis.grid`. :type grid_kwargs: dict, optional :param append_axes_kwargs: Keyword arguments for :func:`mpl_toolkits.axes_grid1.axes_divider.AxesDivider.append_axes`. :type append_axes_kwargs: dict, optional :param kwargs: Keyword arguments for :func:`xarray.plot.imshow`. :type kwargs: dict, optional :return: Plot. :rtype: matplotlib.collections.QuadMesh :See also: `matplotlib.axis.set_xlabel <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_xlabel.html>`_, `matplotlib.axis.set_ylabel <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_ylabel.html>`_, `matplotlib.axis.set_title <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_title.html>`_, `matplotlib.axis.set_aspect <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_aspect.html>`_, `matplotlib.axis.grid <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.grid.html>`_, `mpl_toolkits.axes_grid1.axes_divider.AxesDivider.append_axes <https://matplotlib.org/stable/api/_as_gen/mpl_toolkits.axes_grid1.axes_divider.AxesDivider.html#mpl_toolkits.axes_grid1.axes_divider.AxesDivider.append_axes>`_, `xarray.plot.imshow <http://xarray.pydata.org/en/stable/generated/xarray.plot.imshow.html>`_. """ # Initialise axis if ax is None: _, ax = plt.subplots(1, 1, figsize=(10, 10)) # Get the rescale parameters scale_factor, _, _ = rpc.rescale.get_rescale_parameters(data=da, xy_unit=xy_unit) # Rescale the DataArray da = rpc.rescale.rescale(data=da, scale_factor=scale_factor) # Skip DataArray values if skip > 1: da = da.isel(x=slice(None, None, skip), y=slice(None, None, skip)) # Smooth DataArray if smooth > 1: da = da.rolling(x=smooth, center=True).mean().rolling(y=smooth, center=True).mean() # Append colorbar axis if append_axes_kwargs is not None and ("add_colorbar" not in kwargs or kwargs["add_colorbar"]) and "rgb" not in kwargs: kwargs["cbar_kwargs"] = {} if "cbar_kwargs" not in kwargs or kwargs["cbar_kwargs"] is None else kwargs["cbar_kwargs"] kwargs["cbar_kwargs"]["cax"] = rpc.axes.append_cbar_axis(ax=ax, append_axes_kwargs=append_axes_kwargs) # Plot DataArray p = da.plot.imshow(ax=ax, **kwargs) # Format axis ax = rpc.axes.format( ax=ax, data=da, xy_unit=xy_unit, xlim=xlim, ylim=ylim, xlabel_kwargs=xlabel_kwargs, ylabel_kwargs=ylabel_kwargs, title_kwargs=title_kwargs, aspect_kwargs=aspect_kwargs, grid_kwargs=grid_kwargs, ) # Return plot return p
[docs] def scatter( ds, ax=None, xy_unit=None, skip=1, smooth=1, xlim=None, ylim=None, xlabel_kwargs=None, ylabel_kwargs=None, title_kwargs=None, aspect_kwargs=None, grid_kwargs=None, append_axes_kwargs=None, **kwargs, ): """Plot data using scatter. :param da: Data to plot. :type da: xarray.DataArray :param ax: Axis. :type ax: matplotlib.axes.Axes, optional :param xy_unit: Unit to rescale the x and y dimensions to. If ``None``, the unit is determined automatically based on the input data. :type xy_unit: str, optional :param skip: Plot every nth value in x and y direction. :type skip: int, optional :param smooth: Smooth data array with rolling mean in x and y direction. :type smooth: int, optional :param xlim: x limits. :type xlim: list[float], optional :param ylim: y limits. :type ylim: list[float], optional :param xlabel_kwargs: Keyword arguments for :func:`matplotlib.axis.set_xlabel`. :type xlabel_kwargs: dict, optional :param ylabel_kwargs: Keyword arguments for :func:`matplotlib.axis.set_ylabel`. :type ylabel_kwargs: dict, optional :param title_kwargs: Keyword arguments for :func:`matplotlib.axis.set_title`. :type title_kwargs: dict, optional :param aspect_kwargs: Keyword arguments for :func:`matplotlib.axis.set_aspect`. :type aspect_kwargs: dict, optional :param grid_kwargs: Keyword arguments for :func:`matplotlib.axis.grid`. :type grid_kwargs: dict, optional :param append_axes_kwargs: Keyword arguments for :func:`mpl_toolkits.axes_grid1.axes_divider.AxesDivider.append_axes`. :type append_axes_kwargs: dict, optional :param kwargs: Keyword arguments for :func:`xarray.plot.scatter`. :type kwargs: dict, optional :return: Plot. :rtype: matplotlib.collections.QuadMesh :See also: `matplotlib.axis.set_xlabel <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_xlabel.html>`_, `matplotlib.axis.set_ylabel <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_ylabel.html>`_, `matplotlib.axis.set_title <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_title.html>`_, `matplotlib.axis.set_aspect <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_aspect.html>`_, `matplotlib.axis.grid <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.grid.html>`_, `mpl_toolkits.axes_grid1.axes_divider.AxesDivider.append_axes <https://matplotlib.org/stable/api/_as_gen/mpl_toolkits.axes_grid1.axes_divider.AxesDivider.html#mpl_toolkits.axes_grid1.axes_divider.AxesDivider.append_axes>`_, `xarray.plot.scatter <http://xarray.pydata.org/en/stable/generated/xarray.plot.scatter.html>`_. """ # Initialise axis if ax is None: _, ax = plt.subplots(1, 1, figsize=(10, 10)) # Get the rescale parameters scale_factor, _, _ = rpc.rescale.get_rescale_parameters(data=ds, xy_unit=xy_unit) # Rescale the Dataset ds = rpc.rescale.rescale(data=ds, scale_factor=scale_factor) # Skip Dataset values if skip > 1: ds = ds.isel(x=slice(None, None, skip), y=slice(None, None, skip)) # Smooth Dataset if smooth > 1: ds = ds.rolling(x=smooth, center=True).mean().rolling(y=smooth, center=True).mean() # Append colorbar axis if append_axes_kwargs is not None and ("add_colorbar" in kwargs and kwargs["add_colorbar"]) and ("hue" in kwargs and kwargs["hue"] is not None): kwargs["cbar_kwargs"] = {} if "cbar_kwargs" not in kwargs or kwargs["cbar_kwargs"] is None else kwargs["cbar_kwargs"] kwargs["cbar_kwargs"]["cax"] = rpc.axes.append_cbar_axis(ax=ax, append_axes_kwargs=append_axes_kwargs) # Plot Dataset p = ds.plot.scatter(ax=ax, **kwargs) # Format axis ax = rpc.axes.format( ax=ax, data=ds, xy_unit=xy_unit, xlim=xlim, ylim=ylim, xlabel_kwargs=xlabel_kwargs, ylabel_kwargs=ylabel_kwargs, title_kwargs=title_kwargs, aspect_kwargs=aspect_kwargs, grid_kwargs=grid_kwargs, ) # Return plot return p
[docs] def contourf( da, ax=None, xy_unit=None, skip=1, smooth=1, xlim=None, ylim=None, xlabel_kwargs=None, ylabel_kwargs=None, title_kwargs=None, aspect_kwargs=None, grid_kwargs=None, append_axes_kwargs=None, **kwargs, ): """Plot data using contourf. :param da: Data to plot. :type da: xarray.DataArray :param ax: Axis. :type ax: matplotlib.axes.Axes, optional :param xy_unit: Unit to rescale the x and y dimensions to. If ``None``, the unit is determined automatically based on the input data. :type xy_unit: str, optional :param skip: Plot every nth value in x and y direction. :type skip: int, optional :param smooth: Smooth data array with rolling mean in x and y direction. :type smooth: int, optional :param xlim: x limits. :type xlim: list[float], optional :param ylim: y limits. :type ylim: list[float], optional :param xlabel_kwargs: Keyword arguments for :func:`matplotlib.axis.set_xlabel`. :type xlabel_kwargs: dict, optional :param ylabel_kwargs: Keyword arguments for :func:`matplotlib.axis.set_ylabel`. :type ylabel_kwargs: dict, optional :param title_kwargs: Keyword arguments for :func:`matplotlib.axis.set_title`. :type title_kwargs: dict, optional :param aspect_kwargs: Keyword arguments for :func:`matplotlib.axis.set_aspect`. :type aspect_kwargs: dict, optional :param grid_kwargs: Keyword arguments for :func:`matplotlib.axis.grid`. :type grid_kwargs: dict, optional :param append_axes_kwargs: Keyword arguments for :func:`mpl_toolkits.axes_grid1.axes_divider.AxesDivider.append_axes`. :type append_axes_kwargs: dict, optional :param kwargs: Keyword arguments for :func:`xarray.plot.contourf`. :type kwargs: dict, optional :return: Plot. :rtype: matplotlib.collections.QuadMesh :See also: `matplotlib.axis.set_xlabel <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_xlabel.html>`_, `matplotlib.axis.set_ylabel <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_ylabel.html>`_, `matplotlib.axis.set_title <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_title.html>`_, `matplotlib.axis.set_aspect <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_aspect.html>`_, `matplotlib.axis.grid <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.grid.html>`_, `mpl_toolkits.axes_grid1.axes_divider.AxesDivider.append_axes <https://matplotlib.org/stable/api/_as_gen/mpl_toolkits.axes_grid1.axes_divider.AxesDivider.html#mpl_toolkits.axes_grid1.axes_divider.AxesDivider.append_axes>`_, `xarray.plot.contourf <http://xarray.pydata.org/en/stable/generated/xarray.plot.contourf.html>`_. """ # Initialise axis if ax is None: _, ax = plt.subplots(1, 1, figsize=(10, 10)) # Get the rescale parameters scale_factor, _, _ = rpc.rescale.get_rescale_parameters(data=da, xy_unit=xy_unit) # Rescale the DataArray da = rpc.rescale.rescale(data=da, scale_factor=scale_factor) # Skip DataArray values if skip > 1: da = da.isel(x=slice(None, None, skip), y=slice(None, None, skip)) # Smooth DataArray if smooth > 1: da = da.rolling(x=smooth, center=True).mean().rolling(y=smooth, center=True).mean() # Append colorbar axis if append_axes_kwargs is not None and ("add_colorbar" not in kwargs or kwargs["add_colorbar"]): kwargs["cbar_kwargs"] = {} if "cbar_kwargs" not in kwargs or kwargs["cbar_kwargs"] is None else kwargs["cbar_kwargs"] kwargs["cbar_kwargs"]["cax"] = rpc.axes.append_cbar_axis(ax=ax, append_axes_kwargs=append_axes_kwargs) # Plot DataArray p = da.plot.contourf(ax=ax, **kwargs) # Format axis ax = rpc.axes.format( ax=ax, data=da, xy_unit=xy_unit, xlim=xlim, ylim=ylim, xlabel_kwargs=xlabel_kwargs, ylabel_kwargs=ylabel_kwargs, title_kwargs=title_kwargs, aspect_kwargs=aspect_kwargs, grid_kwargs=grid_kwargs, ) # Return plot return p
[docs] def contour( da, ax=None, xy_unit=None, skip=1, smooth=1, xlim=None, ylim=None, xlabel_kwargs=None, ylabel_kwargs=None, title_kwargs=None, aspect_kwargs=None, grid_kwargs=None, append_axes_kwargs=None, **kwargs, ): """Plot data using contour. :param da: Data to plot. :type da: xarray.DataArray :param ax: Axis. :type ax: matplotlib.axes.Axes, optional :param xy_unit: Unit to rescale the x and y dimensions to. If ``None``, the unit is determined automatically based on the input data. :type xy_unit: str, optional :param skip: Plot every nth value in x and y direction. :type skip: int, optional :param smooth: Smooth data array with rolling mean in x and y direction. :type smooth: int, optional :param xlim: x limits. :type xlim: list[float], optional :param ylim: y limits. :type ylim: list[float], optional :param xlabel_kwargs: Keyword arguments for :func:`matplotlib.axis.set_xlabel`. :type xlabel_kwargs: dict, optional :param ylabel_kwargs: Keyword arguments for :func:`matplotlib.axis.set_ylabel`. :type ylabel_kwargs: dict, optional :param title_kwargs: Keyword arguments for :func:`matplotlib.axis.set_title`. :type title_kwargs: dict, optional :param aspect_kwargs: Keyword arguments for :func:`matplotlib.axis.set_aspect`. :type aspect_kwargs: dict, optional :param grid_kwargs: Keyword arguments for :func:`matplotlib.axis.grid`. :type grid_kwargs: dict, optional :param append_axes_kwargs: Keyword arguments for :func:`mpl_toolkits.axes_grid1.axes_divider.AxesDivider.append_axes`. :type append_axes_kwargs: dict, optional :param kwargs: Keyword arguments for :func:`xarray.plot.contour`. :type kwargs: dict, optional :return: Plot. :rtype: matplotlib.collections.QuadMesh :See also: `matplotlib.axis.set_xlabel <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_xlabel.html>`_, `matplotlib.axis.set_ylabel <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_ylabel.html>`_, `matplotlib.axis.set_title <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_title.html>`_, `matplotlib.axis.set_aspect <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_aspect.html>`_, `matplotlib.axis.grid <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.grid.html>`_, `mpl_toolkits.axes_grid1.axes_divider.AxesDivider.append_axes <https://matplotlib.org/stable/api/_as_gen/mpl_toolkits.axes_grid1.axes_divider.AxesDivider.html#mpl_toolkits.axes_grid1.axes_divider.AxesDivider.append_axes>`_, `xarray.plot.contour <http://xarray.pydata.org/en/stable/generated/xarray.plot.contour.html>`_. """ # Initialise axis if ax is None: _, ax = plt.subplots(1, 1, figsize=(10, 10)) # Get the rescale parameters scale_factor, _, _ = rpc.rescale.get_rescale_parameters(data=da, xy_unit=xy_unit) # Rescale the DataArray da = rpc.rescale.rescale(data=da, scale_factor=scale_factor) # Skip DataArray values if skip > 1: da = da.isel(x=slice(None, None, skip), y=slice(None, None, skip)) # Smooth DataArray if smooth > 1: da = da.rolling(x=smooth, center=True).mean().rolling(y=smooth, center=True).mean() # Append colorbar axis if append_axes_kwargs is not None and ("add_colorbar" in kwargs and kwargs["add_colorbar"]): kwargs["cbar_kwargs"] = {} if "cbar_kwargs" not in kwargs or kwargs["cbar_kwargs"] is None else kwargs["cbar_kwargs"] kwargs["cbar_kwargs"]["cax"] = rpc.axes.append_cbar_axis(ax=ax, append_axes_kwargs=append_axes_kwargs) # Plot DataArray p = da.plot.contour(ax=ax, **kwargs) # Format axis ax = rpc.axes.format( ax=ax, data=da, xy_unit=xy_unit, xlim=xlim, ylim=ylim, xlabel_kwargs=xlabel_kwargs, ylabel_kwargs=ylabel_kwargs, title_kwargs=title_kwargs, aspect_kwargs=aspect_kwargs, grid_kwargs=grid_kwargs, ) # Return plot return p
[docs] def quiver( ds, ax=None, xy_unit=None, skip=1, smooth=1, xlim=None, ylim=None, xlabel_kwargs=None, ylabel_kwargs=None, title_kwargs=None, aspect_kwargs=None, grid_kwargs=None, append_axes_kwargs=None, **kwargs, ): """Plot data using quiver. :param da: Data to plot. :type da: xarray.DataArray :param ax: Axis. :type ax: matplotlib.axes.Axes, optional :param xy_unit: Unit to rescale the x and y dimensions to. If ``None``, the unit is determined automatically based on the input data. :type xy_unit: str, optional :param skip: Plot every nth value in x and y direction. :type skip: int, optional :param smooth: Smooth data array with rolling mean in x and y direction. :type smooth: int, optional :param xlim: x limits. :type xlim: list[float], optional :param ylim: y limits. :type ylim: list[float], optional :param xlabel_kwargs: Keyword arguments for :func:`matplotlib.axis.set_xlabel`. :type xlabel_kwargs: dict, optional :param ylabel_kwargs: Keyword arguments for :func:`matplotlib.axis.set_ylabel`. :type ylabel_kwargs: dict, optional :param title_kwargs: Keyword arguments for :func:`matplotlib.axis.set_title`. :type title_kwargs: dict, optional :param aspect_kwargs: Keyword arguments for :func:`matplotlib.axis.set_aspect`. :type aspect_kwargs: dict, optional :param grid_kwargs: Keyword arguments for :func:`matplotlib.axis.grid`. :type grid_kwargs: dict, optional :param append_axes_kwargs: Keyword arguments for :func:`mpl_toolkits.axes_grid1.axes_divider.AxesDivider.append_axes`. :type append_axes_kwargs: dict, optional :param kwargs: Keyword arguments for :func:`xarray.plot.quiver`. :type kwargs: dict, optional :return: Plot. :rtype: matplotlib.collections.QuadMesh :See also: `matplotlib.axis.set_xlabel <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_xlabel.html>`_, `matplotlib.axis.set_ylabel <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_ylabel.html>`_, `matplotlib.axis.set_title <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_title.html>`_, `matplotlib.axis.set_aspect <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_aspect.html>`_, `matplotlib.axis.grid <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.grid.html>`_, `mpl_toolkits.axes_grid1.axes_divider.AxesDivider.append_axes <https://matplotlib.org/stable/api/_as_gen/mpl_toolkits.axes_grid1.axes_divider.AxesDivider.html#mpl_toolkits.axes_grid1.axes_divider.AxesDivider.append_axes>`_, `xarray.plot.quiver <http://xarray.pydata.org/en/stable/generated/xarray.plot.quiver.html>`_. """ # Initialise axis if ax is None: _, ax = plt.subplots(1, 1, figsize=(10, 10)) # Get the rescale parameters scale_factor, _, _ = rpc.rescale.get_rescale_parameters(data=ds, xy_unit=xy_unit) # Rescale the Dataset ds = rpc.rescale.rescale(data=ds, scale_factor=scale_factor) # Skip Dataset values if skip > 1: ds = ds.isel(x=slice(None, None, skip), y=slice(None, None, skip)) # Append colorbar axis if append_axes_kwargs is not None and ("add_colorbar" in kwargs and kwargs["add_colorbar"]) and ("hue" in kwargs and kwargs["hue"] is not None): kwargs["cbar_kwargs"] = {} if "cbar_kwargs" not in kwargs or kwargs["cbar_kwargs"] is None else kwargs["cbar_kwargs"] kwargs["cbar_kwargs"]["cax"] = rpc.axes.append_cbar_axis(ax=ax, append_axes_kwargs=append_axes_kwargs) # Smooth Dataset if smooth > 1: ds = ds.rolling(x=smooth, center=True).mean().rolling(y=smooth, center=True).mean() # Transpose Dataset ds = ds.transpose("x", "y") # Plot Dataset p = ds.plot.quiver(ax=ax, **kwargs) # Format axis ax = rpc.axes.format( ax=ax, data=ds, xy_unit=xy_unit, xlim=xlim, ylim=ylim, xlabel_kwargs=xlabel_kwargs, ylabel_kwargs=ylabel_kwargs, title_kwargs=title_kwargs, aspect_kwargs=aspect_kwargs, grid_kwargs=grid_kwargs, ) # Return plot return p
[docs] def streamplot( ds, ax=None, xy_unit=None, skip=1, smooth=1, xlim=None, ylim=None, xlabel_kwargs=None, ylabel_kwargs=None, title_kwargs=None, aspect_kwargs=None, grid_kwargs=None, append_axes_kwargs=None, **kwargs, ): """Plot data using streamplot. :param da: Data to plot. :type da: xarray.DataArray :param ax: Axis. :type ax: matplotlib.axes.Axes, optional :param xy_unit: Unit to rescale the x and y dimensions to. If ``None``, the unit is determined automatically based on the input data. :type xy_unit: str, optional :param skip: Plot every nth value in x and y direction. :type skip: int, optional :param smooth: Smooth data array with rolling mean in x and y direction. :type smooth: int, optional :param xlim: x limits. :type xlim: list[float], optional :param ylim: y limits. :type ylim: list[float], optional :param xlabel_kwargs: Keyword arguments for :func:`matplotlib.axis.set_xlabel`. :type xlabel_kwargs: dict, optional :param ylabel_kwargs: Keyword arguments for :func:`matplotlib.axis.set_ylabel`. :type ylabel_kwargs: dict, optional :param title_kwargs: Keyword arguments for :func:`matplotlib.axis.set_title`. :type title_kwargs: dict, optional :param aspect_kwargs: Keyword arguments for :func:`matplotlib.axis.set_aspect`. :type aspect_kwargs: dict, optional :param grid_kwargs: Keyword arguments for :func:`matplotlib.axis.grid`. :type grid_kwargs: dict, optional :param append_axes_kwargs: Keyword arguments for :func:`mpl_toolkits.axes_grid1.axes_divider.AxesDivider.append_axes`. :type append_axes_kwargs: dict, optional :param kwargs: Keyword arguments for :func:`xarray.plot.streamplot`. :type kwargs: dict, optional :return: Plot. :rtype: matplotlib.collections.QuadMesh :See also: `matplotlib.axis.set_xlabel <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_xlabel.html>`_, `matplotlib.axis.set_ylabel <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_ylabel.html>`_, `matplotlib.axis.set_title <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_title.html>`_, `matplotlib.axis.set_aspect <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_aspect.html>`_, `matplotlib.axis.grid <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.grid.html>`_, `mpl_toolkits.axes_grid1.axes_divider.AxesDivider.append_axes <https://matplotlib.org/stable/api/_as_gen/mpl_toolkits.axes_grid1.axes_divider.AxesDivider.html#mpl_toolkits.axes_grid1.axes_divider.AxesDivider.append_axes>`_, `xarray.plot.streamplot <http://xarray.pydata.org/en/stable/generated/xarray.plot.streamplot.html>`_. """ # Initialise axis if ax is None: _, ax = plt.subplots(1, 1, figsize=(10, 10)) # Get the rescale parameters scale_factor, _, _ = rpc.rescale.get_rescale_parameters(data=ds, xy_unit=xy_unit) # Rescale the DataArray ds = rpc.rescale.rescale(data=ds, scale_factor=scale_factor) # Skip DataArray values if skip > 1: ds = ds.isel(x=slice(None, None, skip), y=slice(None, None, skip)) # Smooth DataArray if smooth > 1: ds = ds.rolling(x=smooth, center=True).mean().rolling(y=smooth, center=True).mean() # Sort such that y is srictly increasing ds = ds.sortby("y") # Append colorbar axis if append_axes_kwargs is not None and ("add_colorbar" in kwargs and kwargs["add_colorbar"]) and ("hue" in kwargs and kwargs["hue"] is not None): kwargs["cbar_kwargs"] = {} if "cbar_kwargs" not in kwargs or kwargs["cbar_kwargs"] is None else kwargs["cbar_kwargs"] kwargs["cbar_kwargs"]["cax"] = rpc.axes.append_cbar_axis(ax=ax, append_axes_kwargs=append_axes_kwargs) # Plot Dataset p = ds.plot.streamplot(ax=ax, **kwargs) # Format axis ax = rpc.axes.format( ax=ax, data=ds, xy_unit=xy_unit, xlim=xlim, ylim=ylim, xlabel_kwargs=xlabel_kwargs, ylabel_kwargs=ylabel_kwargs, title_kwargs=title_kwargs, aspect_kwargs=aspect_kwargs, grid_kwargs=grid_kwargs, ) # Return plot return p
[docs] def grid( da, ax=None, xy_unit=None, skip=1, smooth=1, xlim=None, ylim=None, xlabel_kwargs=None, ylabel_kwargs=None, title_kwargs=None, aspect_kwargs=None, grid_kwargs=None, append_axes_kwargs=None, **kwargs, ): """Plot data using grid. :param da: Data to plot. :type da: xarray.DataArray :param ax: Axis. :type ax: matplotlib.axes.Axes, optional :param xy_unit: Unit to rescale the x and y dimensions to. If ``None``, the unit is determined automatically based on the input data. :type xy_unit: str, optional :param skip: Plot every nth value in x and y direction. :type skip: int, optional :param smooth: Smooth data array with rolling mean in x and y direction. :type smooth: int, optional :param xlim: x limits. :type xlim: list[float], optional :param ylim: y limits. :type ylim: list[float], optional :param xlabel_kwargs: Keyword arguments for :func:`matplotlib.axis.set_xlabel`. :type xlabel_kwargs: dict, optional :param ylabel_kwargs: Keyword arguments for :func:`matplotlib.axis.set_ylabel`. :type ylabel_kwargs: dict, optional :param title_kwargs: Keyword arguments for :func:`matplotlib.axis.set_title`. :type title_kwargs: dict, optional :param aspect_kwargs: Keyword arguments for :func:`matplotlib.axis.set_aspect`. :type aspect_kwargs: dict, optional :param grid_kwargs: Keyword arguments for :func:`matplotlib.axis.grid`. :type grid_kwargs: dict, optional :param append_axes_kwargs: Keyword arguments for :func:`mpl_toolkits.axes_grid1.axes_divider.AxesDivider.append_axes`. :type append_axes_kwargs: dict, optional :param kwargs: Keyword arguments for `xarray.plot.grid`. :type kwargs: dict, optional :return: Plot. :rtype: matplotlib.collections.QuadMesh :See also: `matplotlib.axis.set_xlabel <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_xlabel.html>`_, `matplotlib.axis.set_ylabel <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_ylabel.html>`_, `matplotlib.axis.set_title <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_title.html>`_, `matplotlib.axis.set_aspect <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_aspect.html>`_, `matplotlib.axis.grid <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.grid.html>`_, `mpl_toolkits.axes_grid1.axes_divider.AxesDivider.append_axes <https://matplotlib.org/stable/api/_as_gen/mpl_toolkits.axes_grid1.axes_divider.AxesDivider.html#mpl_toolkits.axes_grid1.axes_divider.AxesDivider.append_axes>`_ """ # Initialise axis if ax is None: _, ax = plt.subplots(1, 1, figsize=(10, 10)) # Get the rescale parameters scale_factor, _, _ = rpc.rescale.get_rescale_parameters(data=da, xy_unit=xy_unit) # Get bounds and resolution xmin, ymin, xmax, ymax = da.rio.bounds() xres, yres = da.rio.resolution() # Shift bounds to center of pixel xmin = xmin + xres / 2 ymin = ymin - yres / 2 xmax = xmax - xres / 2 ymax = ymax + yres / 2 # Apply skip factor if skip > 1: xres = xres * skip yres = yres * skip # Shift bounds to edges of pixel xmin = xmin - xres / 2 ymin = ymin + yres / 2 xmax = xmax + xres / 2 ymax = ymax - yres / 2 # Adjust bounds to fix skip factor ymin = ymax - np.ceil((ymax - ymin) / yres) * yres xmax = xmin + np.floor((xmax - xmin) / xres) * xres # Get grid GeoDataFrame lines = [] lines.extend(LineString([(xmin, y), (xmax, y)]) for y in np.arange(ymax, ymin + yres, yres)) lines.extend(LineString([(x, ymin), (x, ymax)]) for x in np.arange(xmin, xmax + xres, xres)) gdf_grid = gpd.GeoDataFrame(geometry=[MultiLineString(lines)], crs=da.rio.crs) # Rescale the GeoDataFrame gdf_grid = rpc.rescale.rescale(data=gdf_grid, scale_factor=scale_factor) # Plot GeoDataFrame ax = _plot_gdf(gdf_grid, ax=ax, **kwargs) # Format axis ax = rpc.axes.format( data=gdf_grid, ax=ax, xy_unit=xy_unit, xlim=xlim, ylim=ylim, xlabel_kwargs=xlabel_kwargs, ylabel_kwargs=ylabel_kwargs, title_kwargs=title_kwargs, aspect_kwargs=aspect_kwargs, grid_kwargs=grid_kwargs, ) # Return plot return ax