Closed
Description
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:
xarray/xarray/plot/facetgrid.py
Lines 339 to 343 in a36d0a1