Open flying-sheep opened 1 month ago
In #3048 we started raising errors for functions that don’t support backed mode, but seems like a tutorial used dendrogram in backed mode: https://scverse-tutorials.readthedocs.io/en/latest/notebooks/scverse_data_backed.html
dendrogram
That was probably a mistake and the data just got loaded to memory, but since dendrogram can be reimplemented using .get.aggregate, we should do that!
.get.aggregate
import scanpy as sc adata = sc.datasets.pbmc3k() adata.filename = "test.h5ad" sc.pl.dotplot(adata, ["FCN1"], groupby="index", dendrogram=True)
--------------------------------------------------------------------------- NotImplementedError Traceback (most recent call last) Cell In[44], line 1 ----> 1 sc.pl.dotplot(mdata["rna"], var_names=["CD2"], groupby="leiden", figsize=(10, 3), dendrogram=True, swap_axes=True) File ~/.local/share/hatch/env/virtual/scverse-tutorials/_YRPCeuX/basic-scrna/lib/python3.12/site-packages/legacy_api_wrap/__init__.py:80, in legacy_api.<locals>.wrapper.<locals>.fn_compatible(*args_all, **kw) 77 @wraps(fn) 78 def fn_compatible(*args_all: P.args, **kw: P.kwargs) -> R: 79 if len(args_all) <= n_positional: ---> 80 return fn(*args_all, **kw) 82 args_pos: P.args 83 args_pos, args_rest = args_all[:n_positional], args_all[n_positional:] File ~/.local/share/hatch/env/virtual/scverse-tutorials/_YRPCeuX/basic-scrna/lib/python3.12/site-packages/scanpy/plotting/_dotplot.py:1046, in dotplot(adata, var_names, groupby, use_raw, log, num_categories, expression_cutoff, mean_only_expressed, cmap, dot_max, dot_min, standard_scale, smallest_dot, title, colorbar_title, size_title, figsize, dendrogram, gene_symbols, var_group_positions, var_group_labels, var_group_rotation, layer, swap_axes, dot_color_df, show, save, ax, return_fig, vmin, vmax, vcenter, norm, **kwds) 1019 dp = DotPlot( 1020 adata, 1021 var_names, (...) 1042 **kwds, 1043 ) 1045 if dendrogram: -> 1046 dp.add_dendrogram(dendrogram_key=dendrogram) 1047 if swap_axes: 1048 dp.swap_axes() File ~/.local/share/hatch/env/virtual/scverse-tutorials/_YRPCeuX/basic-scrna/lib/python3.12/site-packages/scanpy/plotting/_baseplot_class.py:306, in BasePlot.add_dendrogram(self, show, dendrogram_key, size) 302 self.group_extra_size = size 304 # to correctly plot the dendrogram the categories need to be ordered 305 # according to the dendrogram ordering. --> 306 self._reorder_categories_after_dendrogram(dendrogram_key) 308 dendro_ticks = np.arange(len(self.categories)) + 0.5 310 self.group_extra_size = size File ~/.local/share/hatch/env/virtual/scverse-tutorials/_YRPCeuX/basic-scrna/lib/python3.12/site-packages/scanpy/plotting/_baseplot_class.py:897, in BasePlot._reorder_categories_after_dendrogram(self, dendrogram) 894 _categories = _categories[:3] + ["etc."] 895 return ", ".join(_categories) --> 897 key = _get_dendrogram_key(self.adata, dendrogram, self.groupby) 899 dendro_info = self.adata.uns[key] 900 if self.groupby != dendro_info["groupby"]: File ~/.local/share/hatch/env/virtual/scverse-tutorials/_YRPCeuX/basic-scrna/lib/python3.12/site-packages/scanpy/plotting/_anndata.py:2384, in _get_dendrogram_key(adata, dendrogram_key, groupby) 2377 from ..tools._dendrogram import dendrogram 2379 logg.warning( 2380 f"dendrogram data not found (using key={dendrogram_key}). " 2381 "Running `sc.tl.dendrogram` with default parameters. For fine " 2382 "tuning it is recommended to run `sc.tl.dendrogram` independently." 2383 ) -> 2384 dendrogram(adata, groupby, key_added=dendrogram_key) 2386 if "dendrogram_info" not in adata.uns[dendrogram_key]: 2387 raise ValueError( 2388 f"The given dendrogram key ({dendrogram_key!r}) does not contain " 2389 "valid dendrogram information." 2390 ) File ~/.local/share/hatch/env/virtual/scverse-tutorials/_YRPCeuX/basic-scrna/lib/python3.12/site-packages/legacy_api_wrap/__init__.py:80, in legacy_api.<locals>.wrapper.<locals>.fn_compatible(*args_all, **kw) 77 @wraps(fn) 78 def fn_compatible(*args_all: P.args, **kw: P.kwargs) -> R: 79 if len(args_all) <= n_positional: ---> 80 return fn(*args_all, **kw) 82 args_pos: P.args 83 args_pos, args_rest = args_all[:n_positional], args_all[n_positional:] File ~/.local/share/hatch/env/virtual/scverse-tutorials/_YRPCeuX/basic-scrna/lib/python3.12/site-packages/scanpy/tools/_dendrogram.py:121, in dendrogram(adata, groupby, n_pcs, use_rep, var_names, use_raw, cor_method, linkage_method, optimal_ordering, key_added, inplace) 25 @old_positionals( 26 "n_pcs", 27 "use_rep", (...) 49 inplace: bool = True, 50 ) -> dict[str, Any] | None: 51 """\ 52 Computes a hierarchical clustering for the given `groupby` categories. 53 (...) 118 >>> sc.pl.dotplot(adata, markers, groupby='bulk_labels', dendrogram=True) 119 """ --> 121 raise_not_implemented_error_if_backed_type(adata.X, "dendrogram") 122 if isinstance(groupby, str): 123 # if not a list, turn into a list 124 groupby = [groupby] File ~/.local/share/hatch/env/virtual/scverse-tutorials/_YRPCeuX/basic-scrna/lib/python3.12/site-packages/scanpy/_utils/__init__.py:1100, in raise_not_implemented_error_if_backed_type(X, method_name) 1098 def raise_not_implemented_error_if_backed_type(X: object, method_name: str) -> None: 1099 if is_backed_type(X): -> 1100 raise NotImplementedError( 1101 f"{method_name} is not implemented for matrices of type {type(X)}" 1102 ) NotImplementedError: dendrogram is not implemented for matrices of type <class 'anndata._core.sparse_dataset.CSRDataset'>
I made a sketch for an implementation in https://github.com/scverse/scanpy/pull/3204, but aggregate only works with in-memory data. Might be a good idea to fix that!
Please make sure these conditions are met
What happened?
In #3048 we started raising errors for functions that don’t support backed mode, but seems like a tutorial used
dendrogram
in backed mode: https://scverse-tutorials.readthedocs.io/en/latest/notebooks/scverse_data_backed.htmlThat was probably a mistake and the data just got loaded to memory, but since
dendrogram
can be reimplemented using.get.aggregate
, we should do that!Minimal code sample
Error output
Versions