pull_requests: 774872375
This data as json
id | node_id | number | state | locked | title | user | body | created_at | updated_at | closed_at | merged_at | merge_commit_sha | assignee | milestone | draft | head | base | author_association | auto_merge | repo | url | merged_by |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
774872375 | PR_kwDOAMm_X84uL503 | 5948 | closed | 0 | Fix plot.line crash for data of shape (1, N) in _title_for_slice on format_item | 9513634 | <!-- Feel free to remove check-list items aren't relevant to your change --> Affected `xarray` versions `0.20.0`+ When dependabot recently made a PR to update `xarray` to `0.20.0` our integration test CI failed with ``` .... File "/opt/hostedtoolcache/Python/3.8.12/x64/lib/python3.8/site-packages/xarray/plot/plot.py", line 447, in line ax.set_title(darray._title_for_slice()) File "/opt/hostedtoolcache/Python/3.8.12/x64/lib/python3.8/site-packages/xarray/core/dataarray.py", line 3140, in _title_for_slice v=format_item(coord.values), File "/opt/hostedtoolcache/Python/3.8.12/x64/lib/python3.8/site-packages/xarray/core/formatting.py", line 146, in format_item return f"{x:.4}" TypeError: unsupported format string passed to numpy.ndarray.__format__ ``` We use `xarray.Dataarray.plot.line(x="<dim_name>")` to plot data of shape `(N, M)` where `N` and `M` are `>=1`. The crash is caused because the following line https://github.com/pydata/xarray/blob/402a9b398868bd9bd385210138d6f8ea610c8c40/xarray/core/dataarray.py#L3136 allows arrays of shape `()` and `(1,)` to be passed into `format_item`, where both pass this check https://github.com/pydata/xarray/blob/402a9b398868bd9bd385210138d6f8ea610c8c40/xarray/core/formatting.py#L145-L146 But `f"{x:.4}"` only works for arrays of shape `()` and crashes on arrays of shape `(1,)` Before the check was https://github.com/pydata/xarray/blob/a78c1e0115d38cb4461fd1aba93334d440cff49c/xarray/core/formatting.py#L145-L146 Which didn't allow any arrays and caused the float formatting issue. <details> <summary>Code showing the differences</summary> ```python In [1]: import numpy as np In [2]: x = np.array(0.1) In [3]: x.shape Out[3]: () In [4]: np.issubdtype(type(x), np.floating) Out[4]: False In [5]: hasattr(x, "dtype") and np.issubdtype(x.dtype, np.floating) Out[5]: True In [6]: f"{x:.4}" Out[6]: '0.1' In [7]: f"{x.item():.4}" Out[7]: '0.1' In [8]: x = np.array([0.1]) In [9]: x.shape Out[9]: (1,) In [10]: np.issubdtype(type(x), np.floating) Out[10]: False In [11]: hasattr(x, "dtype") and np.issubdtype(x.dtype, np.floating) Out[11]: True In [12]: f"{x:.4}" --------------------------------------------------------------------------- TypeError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_32644/2490801713.py in <module> ----> 1 f"{x:.4}" TypeError: unsupported format string passed to numpy.ndarray.__format__ In [13]: f"{x.item():.4}" Out[13]: '0.1' ``` </details> I hope `TestPlot1D` was the correct place to put the test since the plot itself is 1D but the data which are plotted have a second dimension with size 1 (naming thing and where to put things... 😅). - [x] Tests added - [x] Passes `pre-commit run --all-files` - [x] User visible changes (including notable bug fixes) are documented in `whats-new.rst` PS: Thanks for the awesome package ❤️ | 2021-11-06T22:56:59Z | 2021-11-08T18:40:08Z | 2021-11-08T17:27:45Z | 2021-11-08T17:27:44Z | eac78cc0cc2a205bfaa49aa9a46987116021b97a | 0 | 51b6cd89157defb426cb33afa44124dfbf1fb7bb | 402a9b398868bd9bd385210138d6f8ea610c8c40 | CONTRIBUTOR | 13221727 | https://github.com/pydata/xarray/pull/5948 |
Links from other tables
- 1 row from pull_requests_id in labels_pull_requests