Skip to content

Add Dataset.plot.quiver #4373

Closed
Closed
@dcherian

Description

@dcherian

I think it would be nice to add a quiver plot function. I got this far in my current project:

@xarray.plot.dataset_plot._dsplot
def quiver(ds, x, y, ax, u, v, **kwargs):
    from xarray import broadcast

    if x is None or y is None or u is None or v is None:
        raise ValueError("Must specify x, y, u, v for quiver plots.")

    # matplotlib autoscaling algorithm
    scale = kwargs.pop("scale", None)
    if scale is None:
        npts = ds.dims[x] * ds.dims[y]
        # crude auto-scaling
        # scale is typical arrow length as a multiple of the arrow width
        scale = (
            1.8 * ds.to_array().median().values * np.maximum(10, np.sqrt(npts))
        )  # / span

    ds = ds.squeeze()
    x, y, u, v = broadcast(ds[x], ds[y], ds[u], ds[v])

    # no support for these kwargs right now.
    kwargs.pop("cmap_params")
    kwargs.pop("hue")
    kwargs.pop("hue_style")
    hdl = ax.quiver(x.values, y.values, u.values, v.values, scale=scale, **kwargs)

    return hdl

The autoscaling logic is quite crude; I tried to copy what matplotlib does but got somewhat confused. To get faceting to work properly, we'll need to estimate scale around here:

cmap_params, cbar_kwargs = _process_cmap_cbar_kwargs(
func, self.data[hue].values, **kwargs
)
kwargs["meta_data"]["cmap_params"] = cmap_params
kwargs["meta_data"]["cbar_kwargs"] = cbar_kwargs

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions