hvplot icon indicating copy to clipboard operation
hvplot copied to clipboard

Plot not returning when specify x/y in axis_arguments for chunked NetCDF

Open epifanio opened this issue 1 year ago • 3 comments

Thanks for contacting us! Please read and follow these instructions carefully, then delete this introductory text to keep your issue easy to read. Note that the issue tracker is NOT the place for usage questions and technical assistance; post those at Discourse instead. Issues without the required information below may be closed immediately.

ALL software version info

  • xarray
'2023.12.0'
  • holoviews
'1.18.1'

Description of expected behavior and the observed behavior

When setting the x or y values in the arguments for hvplot.line the code hangs and never return

Complete, minimal, self-contained example code that reproduces the issue

import xarray as xr
import holoviews as hv
import hvplot.xarray

hv.renderer('bokeh').webgl = False 

test_url = "https://thredds.met.no/thredds/dodsC/met.no/observations/stations/SN99880.nc"
ds = xr.open_dataset(test_url)
var = 'air_temperature_2m'

# the following works:
axis_arguments = {'grid':True, 'title': 'title', 'widget_location': 'bottom', 'responsive': False}
ds[var].hvplot.line(**axis_arguments)

#  When trying to set  `x` or `y` values in the `**axis_arguments` for `hvplot.line` the code hangs and never return

axis_arguments = {'y': ds[var], 'grid':True, 'title': 'title', 'widget_location': 'bottom', 'responsive': False}
ds[var].hvplot.line(**axis_arguments)

# same for:

axis_arguments = {'x': ds[var], 'grid':True, 'title': 'title', 'widget_location': 'bottom', 'responsive': False}
ds[var].hvplot.line(**axis_arguments)

Stack traceback and/or browser JavaScript console output

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[24], line 1
----> 1 ds[var].hvplot.line(**axis_arguments)

File /opt/conda/lib/python3.11/site-packages/hvplot/plotting/core.py:370, in hvPlotTabular.line(self, x, y, **kwds)
    275 def line(self, x=None, y=None, **kwds):
    276     """
    277     The `line` plot connects the points with a continuous curve.
    278 
   (...)
    368     - Wiki: https://en.wikipedia.org/wiki/Line_chart
    369     """
--> 370     return self(x, y, kind="line", **kwds)

File /opt/conda/lib/python3.11/site-packages/hvplot/plotting/core.py:93, in hvPlotBase.__call__(self, x, y, kind, **kwds)
     91         return pn.panel(callback)
     92     if panel_dict:
---> 93         plot = self._get_converter(x, y, kind, **kwds)(kind, x, y)
     94         return pn.panel(plot, **panel_dict)
     96 return self._get_converter(x, y, kind, **kwds)(kind, x, y)

File /opt/conda/lib/python3.11/site-packages/hvplot/plotting/core.py:103, in hvPlotBase._get_converter(self, x, y, kind, **kwds)
    101 y = y or params.pop("y", None)
    102 kind = kind or params.pop("kind", None)
--> 103 return HoloViewsConverter(self._data, x, y, kind=kind, **params)

File /opt/conda/lib/python3.11/site-packages/hvplot/converter.py:405, in HoloViewsConverter.__init__(self, data, x, y, kind, by, use_index, group_label, value_label, backlog, persist, use_dask, crs, fields, groupby, dynamic, grid, legend, rot, title, xlim, ylim, clim, symmetric, logx, logy, loglog, hover, subplots, label, invert, stacked, colorbar, datashade, rasterize, downsample, resample_when, row, col, debug, framewise, aggregator, projection, global_extent, geo, precompute, flip_xaxis, flip_yaxis, dynspread, hover_cols, x_sampling, y_sampling, project, tools, attr_labels, coastline, tiles, sort_date, check_symmetric_max, transforms, stream, cnorm, features, rescale_discrete_levels, autorange, **kwds)
    403 self.value_label = value_label
    404 self.label = label
--> 405 self._process_data(
    406     kind, data, x, y, by, groupby, row, col, use_dask,
    407     persist, backlog, label, group_label, value_label,
    408     hover_cols, attr_labels, transforms, stream, kwds
    409 )
    411 self.dynamic = dynamic
    412 self.geo = any([geo, crs, global_extent, projection, project, coastline, features])

File /opt/conda/lib/python3.11/site-packages/hvplot/converter.py:819, in HoloViewsConverter._process_data(self, kind, data, x, y, by, groupby, row, col, use_dask, persist, backlog, label, group_label, value_label, hover_cols, attr_labels, transforms, stream, kwds)
    817     other_dims = []
    818 da = data
--> 819 data, x, y, by_new, groupby_new = process_xarray(
    820     data, x, y, by, groupby, use_dask, persist, gridded,
    821     label, value_label, other_dims, kind=kind)
    823 if kind not in self._stats_types:
    824     if by is None: by = by_new

File /opt/conda/lib/python3.11/site-packages/hvplot/util.py:480, in process_xarray(data, x, y, by, groupby, use_dask, persist, gridded, label, value_label, other_dims, kind)
    478 covered_dims = []
    479 for var in all_vars:
--> 480     if var in dataset.coords:
    481         covered_dims.extend(dataset[var].dims)
    482 leftover_dims = [dim for dim in index_dims
    483                  if dim not in covered_dims + all_vars]

File /opt/conda/lib/python3.11/site-packages/xarray/core/coordinates.py:104, in AbstractCoordinates.__contains__(self, key)
    103 def __contains__(self, key: Hashable) -> bool:
--> 104     return key in self._names

TypeError: unhashable type: 'DataArray'

epifanio avatar Apr 22 '24 09:04 epifanio

As the error is happening in hvplot I will transfer it there.

hoxbro avatar Apr 22 '24 09:04 hoxbro

It looks like you are passing an xarray.DataArray object (ds[var]) as x and y when you should be passing a string (var, or 'air_temperature_2m'). I am wondering what you are trying to achieve though. The first plot which as you say works, looks like what I would be expecting to see:

image

Note that I added some filtering to get rid of some very large values in the data.

jsignell avatar Apr 23 '24 17:04 jsignell

The problem is some inconsistency in the method's behavior. The x: ds[var] syntax works fine for other datasets but not for this one, where the app will hang forever, blocking the service (bokeh/panel serve) to resolve further requests. So if the use of x: ds[var] is not supported, an exception should be raised.

That specific dataset has a fillnull value; which I get rid of with ds.where(ds!= 9.96921e36)

epifanio avatar Apr 30 '24 06:04 epifanio