pydata / pydata/xarray

Label row and column titles with units

Open
#3,534 3 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

topic-plotting
Dominant language
Python
Stars
4.2k
Forks
1.4k
Avg merge
2d 15h
Merged PRs (30d)
14

Description

According to this plotting example, xlabels and ylabels are labeled with units. However, row labels and column labels omit the units.

MCVE Code Sample
import xarray as xr
ds = xr.tutorial.scatter_example_dataset()
ds.plot.scatter(x='A', y='B', col='x', row='z', hue='w', hue_style='discrete')
Expected Output

Should xr.FacetGrid include the functionality for plotting row labels and column labels when provided?
image

Problem Description

It could be solved with the following included in plot/facetgrid.py#L486:

if self.data[self._row_var].attrs.get('units'):
   units =  self.data[self._row_var].attrs['units']   
   template="{coord} = {value} [{units}]"

title = nicetitle(coord=self._row_var, value=row_name, \
                          maxchar=maxchar, template = template, units = unit

and with the following included in plot/facetgrid.py#L499:

if self.data[self._col_var].attrs.get('units'):
   units =  self.data[self._col_var].attrs['units']   
   template="{coord} = {value} [{units}]"

title = nicetitle(coord=self._col_var, value=col_name, \
                          maxchar=maxchar, template = template, units = units)

and with the modification of _nicetitle:

def _nicetitle(coord, value, maxchar, template, units = None):
    """
    Put coord, value in template and truncate at maxchar
    """
    prettyvalue = format_item(value, quote_strings=False)
    if units is not None:
        title = template.format(coord=coord, value=prettyvalue, units = units)
    else:
        title = template.format(coord=coord, value=prettyvalue)

    if len(title) > maxchar:
        title = title[: (maxchar - 3)] + "..."

    return title
Output of xr.show_versions()

INSTALLED VERSIONS

commit: None
python: 3.6.8 (default, Oct 7 2019, 12:59:55)
[GCC 8.3.0]
python-bits: 64
OS: Linux
OS-release: 4.15.0-65-generic
machine: x86_64
processor: x86_64
byteorder: little
LC_ALL: None
LANG: en_US.UTF-8
LOCALE: en_US.UTF-8
libhdf5: 1.10.2
libnetcdf: 4.6.3

xarray: 0.14.0
pandas: 0.24.2
numpy: 1.17.3
scipy: 1.2.1
netCDF4: 1.5.1.2
pydap: installed
h5netcdf: 0.7.4
h5py: 2.9.0
Nio: None
zarr: 2.3.2
cftime: 1.0.3.4
nc_time_axis: 1.2.0
PseudoNetCDF: None
rasterio: 1.0.5
cfgrib: 0.9.6.2
iris: None
bottleneck: 1.2.1
dask: 2.6.0
distributed: 2.6.0
matplotlib: 3.0.3
cartopy: 0.16.0
seaborn: 0.9.0
numbagg: None
setuptools: 41.0.1
pip: 19.3.1
conda: None
pytest: 4.4.1
IPython: 7.1.1
sphinx: 2.0.1

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Read plot/facetgrid.py around the row and column title handling at the linked lines, then run the MCVE using scatter_example_dataset(). Confirm that row and column labels include their coordinates' units when available, while existing labels without units continue to work.

Written by the indexing model from the issue text.

Assessment

Tech stack
matplotlib, python
Domain
data-visualization
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.