pydata / xarray

N-D labeled arrays and datasets in Python
https://xarray.dev
Apache License 2.0
3.56k stars 1.07k forks source link

hue argument for xarray.plot.step() for plotting multiple histograms over shared bins #4288

Open jaicher opened 4 years ago

jaicher commented 4 years ago

Is your feature request related to a problem? Please describe.

I love how efficiently we can plot line data for different observations using xr.DataArray.plot(hue={hue coordinate name}) over a 2D array, and I have appreciated xr.DataArray.plot.step() for plotting histogram data using interval coordinates. Today, I wanted to plot/compare several histograms over the same set of bins. I figured I could write xr.DataArray.plot.step(hue={...}), but I found out that this functionality is not implemented.

Describe the solution you'd like

I think we should have a hue kwarg for xr.DataArray.plot.step(). When specified, we would be able to plot 2D data in the same way as xr.DataArray.plot(), except that we get a set of step plots instead of a set of line plots.

Describe alternatives you've considered

Additional context

I didn't evaluate the other plotting functions implemented, but I suspect that others could appropriately consider a hue argument but do not yet support doing so.

dcherian commented 4 years ago

I think we can add hue and faceting (row, col) support to hist. I am surprised step doesn't support hue already since iot sets a few kwargs before calling line.

Here's the error for step with hue. I think we can safely call this a bug.

~/python/xarray/xarray/plot/plot.py in step(self, *args, **kwargs)
    461     @functools.wraps(step)
    462     def step(self, *args, **kwargs):
--> 463         return step(self._da, *args, **kwargs)
    464 
    465 

~/python/xarray/xarray/plot/plot.py in step(darray, where, drawstyle, ds, *args, **kwargs)
    369     drawstyle = "steps-" + where + drawstyle
    370 
--> 371     return line(darray, *args, drawstyle=drawstyle, **kwargs)
    372 
    373 

~/python/xarray/xarray/plot/plot.py in line(darray, row, col, figsize, aspect, size, ax, hue, x, y, xincrease, yincrease, xscale, yscale, xticks, yticks, xlim, ylim, add_legend, _labels, *args, **kwargs)
    297     # Remove pd.Intervals if contained in xplt.values and/or yplt.values.
    298     xplt_val, yplt_val, xlabel, ylabel, kwargs = _resolve_intervals_1dplot(
--> 299         xplt.values, yplt.values, xlabel, ylabel, kwargs
    300     )
    301 

~/python/xarray/xarray/plot/utils.py in _resolve_intervals_1dplot(xval, yval, xlabel, ylabel, kwargs)
    509 
    510         # Convert intervals to double points
--> 511         if _valid_other_type(np.array([xval, yval]), [pd.Interval]):
    512             raise TypeError("Can't step plot intervals against intervals.")
    513         if _valid_other_type(xval, [pd.Interval]):

ValueError: could not broadcast input array from shape (100,7) into shape (100)

@jaicher PRs to fix these are very welcome!

stale[bot] commented 2 years ago

In order to maintain a list of currently relevant issues, we mark issues as stale after a period of inactivity

If this issue remains relevant, please comment here or remove the stale label; otherwise it will be marked as closed automatically