From 4aec63c9af8bf5862fed20ff850c00b164507673 Mon Sep 17 00:00:00 2001 From: Alicia Diem Date: Wed, 12 Aug 2026 11:50:18 +0200 Subject: [PATCH 1/4] fix: treat int-coded labels as categories in ridgeline plot instead of crash --- src/autoencodix/visualize/_general_visualizer.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/autoencodix/visualize/_general_visualizer.py b/src/autoencodix/visualize/_general_visualizer.py index 2483463f..f3424fa3 100644 --- a/src/autoencodix/visualize/_general_visualizer.py +++ b/src/autoencodix/visualize/_general_visualizer.py @@ -691,9 +691,19 @@ def _plot_latent_ridge( # print(labels[0]) if not isinstance(labels[0], str): - if len(np.unique(labels)) > 3: - # Change all non-float labels to NaN - labels = [x if isinstance(x, float) else float("nan") for x in labels] + is_int_valued = all( + isinstance(x, (int, np.integer)) and not isinstance(x, bool) + for x in labels + ) + if len(np.unique(labels)) > 3 and not is_int_valued: + # Coerce non-numeric entries to NaN, keep numeric values + labels = [ + x + if isinstance(x, (int, float, np.integer, np.floating)) + and not isinstance(x, bool) + else float("nan") + for x in labels + ] labels = list( pd.qcut( x=pd.Series(labels), From f945d3a269b6d1376489e017362222ee6e0f0125 Mon Sep 17 00:00:00 2001 From: Alicia Diem Date: Wed, 12 Aug 2026 13:49:12 +0200 Subject: [PATCH 2/4] fix wrong formatting --- src/autoencodix/visualize/_general_visualizer.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/autoencodix/visualize/_general_visualizer.py b/src/autoencodix/visualize/_general_visualizer.py index f3424fa3..dfc84ad3 100644 --- a/src/autoencodix/visualize/_general_visualizer.py +++ b/src/autoencodix/visualize/_general_visualizer.py @@ -698,10 +698,12 @@ def _plot_latent_ridge( if len(np.unique(labels)) > 3 and not is_int_valued: # Coerce non-numeric entries to NaN, keep numeric values labels = [ - x - if isinstance(x, (int, float, np.integer, np.floating)) - and not isinstance(x, bool) - else float("nan") + ( + x + if isinstance(x, (int, float, np.integer, np.floating)) + and not isinstance(x, bool) + else float("nan") + ) for x in labels ] labels = list( From d244bd1b35bc225977497c47bf4d8db3b50e3567 Mon Sep 17 00:00:00 2001 From: Jan Ewald Date: Fri, 14 Aug 2026 15:19:49 +0200 Subject: [PATCH 3/4] new suggested fix for issue --- .../visualize/_general_visualizer.py | 61 ++++++++++--------- .../visualize/_xmodal_visualizer.py | 25 +++++--- src/autoencodix/visualize/visualize.py | 50 +++++++++------ 3 files changed, 81 insertions(+), 55 deletions(-) diff --git a/src/autoencodix/visualize/_general_visualizer.py b/src/autoencodix/visualize/_general_visualizer.py index dfc84ad3..72e4ae29 100644 --- a/src/autoencodix/visualize/_general_visualizer.py +++ b/src/autoencodix/visualize/_general_visualizer.py @@ -473,18 +473,23 @@ def _plot_2D( print( "The provided label column is numeric and converted to categories." ) - labels = [ - float("nan") if not isinstance(x, float) else x for x in labels - ] - labels = ( - pd.qcut( - x=pd.Series(labels), - q=4, + # Try to convert all labels to float, if fails, convert to nan + for i in range(len(labels)): + try: + labels[i] = float(labels[i]) + except ValueError: + labels[i] = float("nan") + # Check if all labels are NaN, convert to string + if all(np.isnan(labels)): + labels = [str(x) for x in labels] + else: + labels = list( + pd.qcut( + x=pd.Series(labels), + q=4, labels=["1stQ", "2ndQ", "3rdQ", "4thQ"], + ).astype(str) ) - .astype(str) - .to_list() - ) else: center = False ## Disable centering for numeric params numeric = True @@ -691,28 +696,24 @@ def _plot_latent_ridge( # print(labels[0]) if not isinstance(labels[0], str): - is_int_valued = all( - isinstance(x, (int, np.integer)) and not isinstance(x, bool) - for x in labels - ) - if len(np.unique(labels)) > 3 and not is_int_valued: - # Coerce non-numeric entries to NaN, keep numeric values - labels = [ - ( - x - if isinstance(x, (int, float, np.integer, np.floating)) - and not isinstance(x, bool) - else float("nan") - ) - for x in labels - ] - labels = list( - pd.qcut( - x=pd.Series(labels), - q=4, + if len(np.unique(labels)) > 3: + # Try to convert all labels to float, if fails, convert to nan + for i in range(len(labels)): + try: + labels[i] = float(labels[i]) + except ValueError: + labels[i] = float("nan") + # Check if all labels are NaN, convert to string + if all(np.isnan(labels)): + labels = [str(x) for x in labels] + else: + labels = list( + pd.qcut( + x=pd.Series(labels), + q=4, labels=["1stQ", "2ndQ", "3rdQ", "4thQ"], ).astype(str) - ) + ) else: labels = [str(x) for x in labels] diff --git a/src/autoencodix/visualize/_xmodal_visualizer.py b/src/autoencodix/visualize/_xmodal_visualizer.py index e7c2d837..ff70e700 100644 --- a/src/autoencodix/visualize/_xmodal_visualizer.py +++ b/src/autoencodix/visualize/_xmodal_visualizer.py @@ -695,13 +695,24 @@ def _plot_latent_ridge_multi( # print(labels[0]) if not isinstance(labels[0], str): if len(np.unique(labels)) > 3: - # Change all non-float labels to NaN - labels = [x if isinstance(x, float) else float("nan") for x in labels] - labels = pd.qcut( - x=pd.Series(labels), - q=4, - labels=["1stQ", "2ndQ", "3rdQ", "4thQ"], - ).astype(str) + # Try to convert all labels to float, if fails, convert to nan + for i in range(len(labels)): + try: + labels[i] = float(labels[i]) + except ValueError: + labels[i] = float("nan") + # Check if all labels are NaN, convert to string + if all(np.isnan(labels)): + labels = [str(x) for x in labels] + else: + labels = list( + pd.qcut( + x=pd.Series(labels), + q=4, + labels=["1stQ", "2ndQ", "3rdQ", "4thQ"], + ).astype(str) + ) + else: labels = [str(x) for x in labels] diff --git a/src/autoencodix/visualize/visualize.py b/src/autoencodix/visualize/visualize.py index 9f09d4bf..73ca596d 100644 --- a/src/autoencodix/visualize/visualize.py +++ b/src/autoencodix/visualize/visualize.py @@ -704,19 +704,23 @@ def plot_2D( print( "The provided label column is numeric and converted to categories." ) - # Change non-float labels to NaN - labels = [ - x if isinstance(x, float) else float("nan") for x in labels - ] - labels = ( - pd.qcut( - x=pd.Series(labels), - q=4, + # Try to convert all labels to float, if fails, convert to nan + for i in range(len(labels)): + try: + labels[i] = float(labels[i]) + except ValueError: + labels[i] = float("nan") + # Check if all labels are NaN, convert to string + if all(np.isnan(labels)): + labels = [str(x) for x in labels] + else: + labels = list( + pd.qcut( + x=pd.Series(labels), + q=4, labels=["1stQ", "2ndQ", "3rdQ", "4thQ"], + ).astype(str) ) - .astype(str) - .to_list() - ) else: center = False ## Disable centering for numeric params numeric = True @@ -834,13 +838,23 @@ def plot_latent_ridge( # print(labels[0]) if not isinstance(labels[0], str): if len(np.unique(labels)) > 3: - # Change non-float labels to NaN - labels = [x if isinstance(x, float) else float("nan") for x in labels] - labels = pd.qcut( - x=pd.Series(labels), - q=4, - labels=["1stQ", "2ndQ", "3rdQ", "4thQ"], - ).astype(str) + # Try to convert all labels to float, if fails, convert to nan + for i in range(len(labels)): + try: + labels[i] = float(labels[i]) + except ValueError: + labels[i] = float("nan") + # Check if all labels are NaN, convert to string + if all(np.isnan(labels)): + labels = [str(x) for x in labels] + else: + labels = list( + pd.qcut( + x=pd.Series(labels), + q=4, + labels=["1stQ", "2ndQ", "3rdQ", "4thQ"], + ).astype(str) + ) else: labels = [str(x) for x in labels] From 073fceb80ed04692c1d583d8ac28c80e948d0ce8 Mon Sep 17 00:00:00 2001 From: Jan Ewald Date: Fri, 14 Aug 2026 15:22:10 +0200 Subject: [PATCH 4/4] Black formatting for dev branch --- src/autoencodix/base/_base_pipeline.py | 6 ++++-- src/autoencodix/visualize/_general_visualizer.py | 8 ++++---- src/autoencodix/visualize/_xmodal_visualizer.py | 6 +++--- src/autoencodix/visualize/visualize.py | 8 ++++---- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/autoencodix/base/_base_pipeline.py b/src/autoencodix/base/_base_pipeline.py index fa0d446f..83c49ab2 100644 --- a/src/autoencodix/base/_base_pipeline.py +++ b/src/autoencodix/base/_base_pipeline.py @@ -106,7 +106,8 @@ def __init__( TypeError: If inputs have incorrect types. """ if not hasattr(self, "_default_config"): - raise ValueError(""" + raise ValueError( + """ The _default_config attribute has not been specified in your pipeline class. Example: @@ -116,7 +117,8 @@ def __init__( _default_config in its corresponding pipeline class. For more details, please refer to the 'how to add a new architecture' section in our documentation. - """) + """ + ) self.model_map = kwargs.pop("model_map", None) self._validate_config(config=config) self._validate_user_input(data=data) diff --git a/src/autoencodix/visualize/_general_visualizer.py b/src/autoencodix/visualize/_general_visualizer.py index 72e4ae29..96400617 100644 --- a/src/autoencodix/visualize/_general_visualizer.py +++ b/src/autoencodix/visualize/_general_visualizer.py @@ -487,8 +487,8 @@ def _plot_2D( pd.qcut( x=pd.Series(labels), q=4, - labels=["1stQ", "2ndQ", "3rdQ", "4thQ"], - ).astype(str) + labels=["1stQ", "2ndQ", "3rdQ", "4thQ"], + ).astype(str) ) else: center = False ## Disable centering for numeric params @@ -711,8 +711,8 @@ def _plot_latent_ridge( pd.qcut( x=pd.Series(labels), q=4, - labels=["1stQ", "2ndQ", "3rdQ", "4thQ"], - ).astype(str) + labels=["1stQ", "2ndQ", "3rdQ", "4thQ"], + ).astype(str) ) else: labels = [str(x) for x in labels] diff --git a/src/autoencodix/visualize/_xmodal_visualizer.py b/src/autoencodix/visualize/_xmodal_visualizer.py index ff70e700..d9287775 100644 --- a/src/autoencodix/visualize/_xmodal_visualizer.py +++ b/src/autoencodix/visualize/_xmodal_visualizer.py @@ -709,10 +709,10 @@ def _plot_latent_ridge_multi( pd.qcut( x=pd.Series(labels), q=4, - labels=["1stQ", "2ndQ", "3rdQ", "4thQ"], - ).astype(str) + labels=["1stQ", "2ndQ", "3rdQ", "4thQ"], + ).astype(str) ) - + else: labels = [str(x) for x in labels] diff --git a/src/autoencodix/visualize/visualize.py b/src/autoencodix/visualize/visualize.py index 73ca596d..3e8e7251 100644 --- a/src/autoencodix/visualize/visualize.py +++ b/src/autoencodix/visualize/visualize.py @@ -718,8 +718,8 @@ def plot_2D( pd.qcut( x=pd.Series(labels), q=4, - labels=["1stQ", "2ndQ", "3rdQ", "4thQ"], - ).astype(str) + labels=["1stQ", "2ndQ", "3rdQ", "4thQ"], + ).astype(str) ) else: center = False ## Disable centering for numeric params @@ -852,8 +852,8 @@ def plot_latent_ridge( pd.qcut( x=pd.Series(labels), q=4, - labels=["1stQ", "2ndQ", "3rdQ", "4thQ"], - ).astype(str) + labels=["1stQ", "2ndQ", "3rdQ", "4thQ"], + ).astype(str) ) else: labels = [str(x) for x in labels]