hooks to "prepare" xarray objects for plotting
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 4.2k
- Forks
- 1.4k
- Avg merge
- 2d 15h
- Merged PRs (30d)
- 14
Description
From https://github.com/xarray-contrib/pint-xarray/pull/61#discussion_r662485351
matplotlib has a module called matplotlib.units which manages a mapping of types to hooks. This is then used to convert custom types to something matplotlib can work with, and to optionally add axis labels. For example, with pint:
In [9]: ureg = pint.UnitRegistry()
...: ureg.setup_matplotlib()
...:
...: t = ureg.Quantity(np.arange(10), "s")
...: v = ureg.Quantity(5, "m / s")
...: x = v * t
...:
...: fig, ax = plt.subplots(1, 1)
...: ax.plot(t, x)
...:
...: plt.show()
this will plot the data without UnitStrippedWarnings and even attach the units as labels to the axis (the format is hard-coded in pint right now).
While this is pretty neat there are some issues:
xarray's plotting code converts tomasked_array, dropping metadata on the duck array (which meansmatplotlibwon't see the duck arrays)- we will end up overwriting the axis labels once the variable names are added (not sure if there's a way to specify a label format?)
- it is
matplotlibspecific, which means we have to reimplement once we go through with the plotting entrypoints discussed in #3553 and #3640
All of this makes me wonder: should we try to maintain our own mapping of hooks which "prepare" the object based on the data's type? My initial idea would be that the hook function receives a Dataset or DataArray object and modifies it to convert the data to numpy arrays and optionally modifies the attrs.
For example for pint the hook would return the result of .pint.dequantify() but it could also be used to explicitly call .get on cupy arrays or .todense on sparse arrays.
xref #5561
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reading matplotlib.units and the plotting entrypoints discussed in #3553 and #3640, then review the xarray plotting behavior described here. Define the hook API and its handling of pint, cupy, and sparse objects; done means the design is agreed and the preparation path is implemented without losing required metadata.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- numpy, python
- Domain
- data-visualization
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100