From 6f8cb0d0022594e9a3ff729a82374791d523ca93 Mon Sep 17 00:00:00 2001 From: JAnns98 Date: Mon, 9 Sep 2024 16:50:58 +0800 Subject: [PATCH] Created a function in plot_tools to plot the contrast curve for the extra mini meta and delta delta --- dabest/_modidx.py | 2 + dabest/plot_tools.py | 64 +++++++++++++++++++- dabest/plotter.py | 122 +++++++++++++++++++++------------------ nbs/API/plot_tools.ipynb | 63 +++++++++++++++++++- nbs/API/plotter.ipynb | 122 +++++++++++++++++++++------------------ 5 files changed, 257 insertions(+), 116 deletions(-) diff --git a/dabest/_modidx.py b/dabest/_modidx.py index b6562007..bb659f0c 100644 --- a/dabest/_modidx.py +++ b/dabest/_modidx.py @@ -98,6 +98,8 @@ 'dabest.plot_tools.get_swarm_spans': ('API/plot_tools.html#get_swarm_spans', 'dabest/plot_tools.py'), 'dabest.plot_tools.halfviolin': ('API/plot_tools.html#halfviolin', 'dabest/plot_tools.py'), 'dabest.plot_tools.normalize_dict': ('API/plot_tools.html#normalize_dict', 'dabest/plot_tools.py'), + 'dabest.plot_tools.plot_minimeta_or_deltadelta_violins': ( 'API/plot_tools.html#plot_minimeta_or_deltadelta_violins', + 'dabest/plot_tools.py'), 'dabest.plot_tools.sankeydiag': ('API/plot_tools.html#sankeydiag', 'dabest/plot_tools.py'), 'dabest.plot_tools.single_sankey': ('API/plot_tools.html#single_sankey', 'dabest/plot_tools.py'), 'dabest.plot_tools.slopegraph_plotter': ( 'API/plot_tools.html#slopegraph_plotter', diff --git a/dabest/plot_tools.py b/dabest/plot_tools.py index ef73e95b..80b7f437 100644 --- a/dabest/plot_tools.py +++ b/dabest/plot_tools.py @@ -6,7 +6,8 @@ # %% auto 0 __all__ = ['halfviolin', 'get_swarm_spans', 'error_bar', 'check_data_matches_labels', 'normalize_dict', 'width_determine', 'single_sankey', 'sankeydiag', 'summary_bars_plotter', 'contrast_bars_plotter', 'swarm_bars_plotter', - 'delta_text_plotter', 'DeltaDotsPlotter', 'slopegraph_plotter', 'swarmplot', 'SwarmPlot'] + 'delta_text_plotter', 'DeltaDotsPlotter', 'slopegraph_plotter', 'plot_minimeta_or_deltadelta_violins', + 'swarmplot', 'SwarmPlot'] # %% ../nbs/API/plot_tools.ipynb 4 import math @@ -1173,6 +1174,67 @@ def slopegraph_plotter(dabest_obj, plot_data, xvar, yvar, color_col, plot_palett x_start = x_start + grp_count +def plot_minimeta_or_deltadelta_violins(show_mini_meta, effectsize_df, ci_type, rawdata_axes, + contrast_axes, violinplot_kwargs, halfviolin_alpha, ytick_color, + es_marker_size, group_summary_kwargs, contrast_xtick_labels, effect_size + ): + if show_mini_meta: + mini_meta_delta = effectsize_df.mini_meta_delta + data = mini_meta_delta.bootstraps_weighted_delta + difference = mini_meta_delta.difference + if ci_type == "bca": + ci_low = mini_meta_delta.bca_low + ci_high = mini_meta_delta.bca_high + else: + ci_low = mini_meta_delta.pct_low + ci_high = mini_meta_delta.pct_high + else: + delta_delta = effectsize_df.delta_delta + data = delta_delta.bootstraps_delta_delta + difference = delta_delta.difference + if ci_type == "bca": + ci_low = delta_delta.bca_low + ci_high = delta_delta.bca_high + else: + ci_low = delta_delta.pct_low + ci_high = delta_delta.pct_high + # Create the violinplot. + # New in v0.2.6: drop negative infinities before plotting. + position = max(rawdata_axes.get_xticks()) + 2 + v = contrast_axes.violinplot( + data[~np.isinf(data)], positions=[position], **violinplot_kwargs + ) + + fc = "grey" + + halfviolin(v, fill_color=fc, alpha=halfviolin_alpha) + + # Plot the effect size. + contrast_axes.plot( + [position], + difference, + marker="o", + color=ytick_color, + markersize=es_marker_size, + ) + # Plot the confidence interval. + contrast_axes.plot( + [position, position], + [ci_low, ci_high], + linestyle="-", + color=ytick_color, + linewidth=group_summary_kwargs["lw"], + ) + if show_mini_meta: + contrast_xtick_labels.extend(["", "Weighted delta"]) + elif effect_size == "delta_g": + contrast_xtick_labels.extend(["", "deltas' g"]) + else: + contrast_xtick_labels.extend(["", "delta-delta"]) + + return contrast_xtick_labels + ... + # %% ../nbs/API/plot_tools.ipynb 6 def swarmplot( data: pd.DataFrame, diff --git a/dabest/plotter.py b/dabest/plotter.py index 3e8f4408..cb9f5b6f 100644 --- a/dabest/plotter.py +++ b/dabest/plotter.py @@ -78,6 +78,7 @@ def effectsize_df_plotter(effectsize_df, **plot_kwargs): delta_text_plotter, DeltaDotsPlotter, slopegraph_plotter, + plot_minimeta_or_deltadelta_violins, ) from ._stats_tools.effsize import ( _compute_standardizers, @@ -440,59 +441,66 @@ def effectsize_df_plotter(effectsize_df, **plot_kwargs): # Plot mini-meta violin if show_mini_meta or show_delta2: - if show_mini_meta: - mini_meta_delta = effectsize_df.mini_meta_delta - data = mini_meta_delta.bootstraps_weighted_delta - difference = mini_meta_delta.difference - if ci_type == "bca": - ci_low = mini_meta_delta.bca_low - ci_high = mini_meta_delta.bca_high - else: - ci_low = mini_meta_delta.pct_low - ci_high = mini_meta_delta.pct_high - else: - delta_delta = effectsize_df.delta_delta - data = delta_delta.bootstraps_delta_delta - difference = delta_delta.difference - if ci_type == "bca": - ci_low = delta_delta.bca_low - ci_high = delta_delta.bca_high - else: - ci_low = delta_delta.pct_low - ci_high = delta_delta.pct_high - # Create the violinplot. - # New in v0.2.6: drop negative infinities before plotting. - position = max(rawdata_axes.get_xticks()) + 2 - v = contrast_axes.violinplot( - data[~np.isinf(data)], positions=[position], **violinplot_kwargs - ) - - fc = "grey" - - halfviolin(v, fill_color=fc, alpha=halfviolin_alpha) - - # Plot the effect size. - contrast_axes.plot( - [position], - difference, - marker="o", - color=ytick_color, - markersize=es_marker_size, - ) - # Plot the confidence interval. - contrast_axes.plot( - [position, position], - [ci_low, ci_high], - linestyle="-", - color=ytick_color, - linewidth=group_summary_kwargs["lw"], - ) - if show_mini_meta: - contrast_xtick_labels.extend(["", "Weighted delta"]) - elif effect_size == "delta_g": - contrast_xtick_labels.extend(["", "deltas' g"]) - else: - contrast_xtick_labels.extend(["", "delta-delta"]) + contrast_xtick_labels = plot_minimeta_or_deltadelta_violins(show_mini_meta=show_mini_meta, effectsize_df=effectsize_df, + ci_type=ci_type, rawdata_axes=rawdata_axes,contrast_axes=contrast_axes, + violinplot_kwargs=violinplot_kwargs, halfviolin_alpha=halfviolin_alpha, + ytick_color=ytick_color, es_marker_size=es_marker_size, group_summary_kwargs=group_summary_kwargs, + contrast_xtick_labels=contrast_xtick_labels, effect_size=effect_size + ) + + # if show_mini_meta: + # mini_meta_delta = effectsize_df.mini_meta_delta + # data = mini_meta_delta.bootstraps_weighted_delta + # difference = mini_meta_delta.difference + # if ci_type == "bca": + # ci_low = mini_meta_delta.bca_low + # ci_high = mini_meta_delta.bca_high + # else: + # ci_low = mini_meta_delta.pct_low + # ci_high = mini_meta_delta.pct_high + # else: + # delta_delta = effectsize_df.delta_delta + # data = delta_delta.bootstraps_delta_delta + # difference = delta_delta.difference + # if ci_type == "bca": + # ci_low = delta_delta.bca_low + # ci_high = delta_delta.bca_high + # else: + # ci_low = delta_delta.pct_low + # ci_high = delta_delta.pct_high + # # Create the violinplot. + # # New in v0.2.6: drop negative infinities before plotting. + # position = max(rawdata_axes.get_xticks()) + 2 + # v = contrast_axes.violinplot( + # data[~np.isinf(data)], positions=[position], **violinplot_kwargs + # ) + + # fc = "grey" + + # halfviolin(v, fill_color=fc, alpha=halfviolin_alpha) + + # # Plot the effect size. + # contrast_axes.plot( + # [position], + # difference, + # marker="o", + # color=ytick_color, + # markersize=es_marker_size, + # ) + # # Plot the confidence interval. + # contrast_axes.plot( + # [position, position], + # [ci_low, ci_high], + # linestyle="-", + # color=ytick_color, + # linewidth=group_summary_kwargs["lw"], + # ) + # if show_mini_meta: + # contrast_xtick_labels.extend(["", "Weighted delta"]) + # elif effect_size == "delta_g": + # contrast_xtick_labels.extend(["", "deltas' g"]) + # else: + # contrast_xtick_labels.extend(["", "delta-delta"]) # Make sure the contrast_axes x-lims match the rawdata_axes xlims, # and add an extra violinplot tick for delta-delta plot. @@ -1099,8 +1107,8 @@ def effectsize_df_plotter(effectsize_df, **plot_kwargs): if contrast_bars: contrast_bars_plotter(results=results, ax_to_plot=contrast_axes, swarm_plot_ax=rawdata_axes,ticks_to_plot=ticks_to_plot, contrast_bars_kwargs=contrast_bars_kwargs, color_col=color_col, swarm_colors=swarm_colors, show_mini_meta=show_mini_meta, - mini_meta_delta=mini_meta_delta if show_mini_meta else None, show_delta2=show_delta2, - delta_delta=delta_delta if show_delta2 else None, proportional=proportional, is_paired=is_paired) + mini_meta_delta=effectsize_df.mini_meta_delta if show_mini_meta else None, show_delta2=show_delta2, + delta_delta=effectsize_df.delta_delta if show_delta2 else None, proportional=proportional, is_paired=is_paired) # Summary bars WIP summary_bars = plot_kwargs["summary_bars"] @@ -1113,8 +1121,8 @@ def effectsize_df_plotter(effectsize_df, **plot_kwargs): if delta_text: delta_text_plotter(results=results, ax_to_plot=contrast_axes, swarm_plot_ax=rawdata_axes, ticks_to_plot=ticks_to_plot, delta_text_kwargs=delta_text_kwargs, color_col=color_col, swarm_colors=swarm_colors, is_paired=is_paired,proportional=proportional, float_contrast=float_contrast, show_mini_meta=show_mini_meta, - mini_meta_delta=mini_meta_delta if show_mini_meta else None, show_delta2=show_delta2, - delta_delta=delta_delta if show_delta2 else None) + mini_meta_delta=effectsize_df.mini_meta_delta if show_mini_meta else None, show_delta2=show_delta2, + delta_delta=effectsize_df.delta_delta if show_delta2 else None) ################################################### Swarm & Contrast & Summary Bars & Delta text WIP END # Make sure no stray ticks appear! diff --git a/nbs/API/plot_tools.ipynb b/nbs/API/plot_tools.ipynb index 3638f80d..45cd1838 100644 --- a/nbs/API/plot_tools.ipynb +++ b/nbs/API/plot_tools.ipynb @@ -1225,7 +1225,68 @@ "\n", " rawdata_axes.plot(x_points, y_points, **slopegraph_kwargs)\n", "\n", - " x_start = x_start + grp_count" + " x_start = x_start + grp_count\n", + "\n", + "def plot_minimeta_or_deltadelta_violins(show_mini_meta, effectsize_df, ci_type, rawdata_axes,\n", + " contrast_axes, violinplot_kwargs, halfviolin_alpha, ytick_color, \n", + " es_marker_size, group_summary_kwargs, contrast_xtick_labels, effect_size\n", + " ):\n", + " if show_mini_meta:\n", + " mini_meta_delta = effectsize_df.mini_meta_delta\n", + " data = mini_meta_delta.bootstraps_weighted_delta\n", + " difference = mini_meta_delta.difference\n", + " if ci_type == \"bca\":\n", + " ci_low = mini_meta_delta.bca_low\n", + " ci_high = mini_meta_delta.bca_high\n", + " else:\n", + " ci_low = mini_meta_delta.pct_low\n", + " ci_high = mini_meta_delta.pct_high\n", + " else:\n", + " delta_delta = effectsize_df.delta_delta\n", + " data = delta_delta.bootstraps_delta_delta\n", + " difference = delta_delta.difference\n", + " if ci_type == \"bca\":\n", + " ci_low = delta_delta.bca_low\n", + " ci_high = delta_delta.bca_high\n", + " else:\n", + " ci_low = delta_delta.pct_low\n", + " ci_high = delta_delta.pct_high\n", + " # Create the violinplot.\n", + " # New in v0.2.6: drop negative infinities before plotting.\n", + " position = max(rawdata_axes.get_xticks()) + 2\n", + " v = contrast_axes.violinplot(\n", + " data[~np.isinf(data)], positions=[position], **violinplot_kwargs\n", + " )\n", + "\n", + " fc = \"grey\"\n", + "\n", + " halfviolin(v, fill_color=fc, alpha=halfviolin_alpha)\n", + "\n", + " # Plot the effect size.\n", + " contrast_axes.plot(\n", + " [position],\n", + " difference,\n", + " marker=\"o\",\n", + " color=ytick_color,\n", + " markersize=es_marker_size,\n", + " )\n", + " # Plot the confidence interval.\n", + " contrast_axes.plot(\n", + " [position, position],\n", + " [ci_low, ci_high],\n", + " linestyle=\"-\",\n", + " color=ytick_color,\n", + " linewidth=group_summary_kwargs[\"lw\"],\n", + " )\n", + " if show_mini_meta:\n", + " contrast_xtick_labels.extend([\"\", \"Weighted delta\"])\n", + " elif effect_size == \"delta_g\":\n", + " contrast_xtick_labels.extend([\"\", \"deltas' g\"])\n", + " else:\n", + " contrast_xtick_labels.extend([\"\", \"delta-delta\"])\n", + " \n", + " return contrast_xtick_labels\n", + " ..." ] }, { diff --git a/nbs/API/plotter.ipynb b/nbs/API/plotter.ipynb index 4fbc667f..ff99ec02 100644 --- a/nbs/API/plotter.ipynb +++ b/nbs/API/plotter.ipynb @@ -137,6 +137,7 @@ " delta_text_plotter,\n", " DeltaDotsPlotter,\n", " slopegraph_plotter,\n", + " plot_minimeta_or_deltadelta_violins,\n", " )\n", " from ._stats_tools.effsize import (\n", " _compute_standardizers,\n", @@ -499,59 +500,66 @@ "\n", " # Plot mini-meta violin\n", " if show_mini_meta or show_delta2:\n", - " if show_mini_meta:\n", - " mini_meta_delta = effectsize_df.mini_meta_delta\n", - " data = mini_meta_delta.bootstraps_weighted_delta\n", - " difference = mini_meta_delta.difference\n", - " if ci_type == \"bca\":\n", - " ci_low = mini_meta_delta.bca_low\n", - " ci_high = mini_meta_delta.bca_high\n", - " else:\n", - " ci_low = mini_meta_delta.pct_low\n", - " ci_high = mini_meta_delta.pct_high\n", - " else:\n", - " delta_delta = effectsize_df.delta_delta\n", - " data = delta_delta.bootstraps_delta_delta\n", - " difference = delta_delta.difference\n", - " if ci_type == \"bca\":\n", - " ci_low = delta_delta.bca_low\n", - " ci_high = delta_delta.bca_high\n", - " else:\n", - " ci_low = delta_delta.pct_low\n", - " ci_high = delta_delta.pct_high\n", - " # Create the violinplot.\n", - " # New in v0.2.6: drop negative infinities before plotting.\n", - " position = max(rawdata_axes.get_xticks()) + 2\n", - " v = contrast_axes.violinplot(\n", - " data[~np.isinf(data)], positions=[position], **violinplot_kwargs\n", - " )\n", - "\n", - " fc = \"grey\"\n", - "\n", - " halfviolin(v, fill_color=fc, alpha=halfviolin_alpha)\n", - "\n", - " # Plot the effect size.\n", - " contrast_axes.plot(\n", - " [position],\n", - " difference,\n", - " marker=\"o\",\n", - " color=ytick_color,\n", - " markersize=es_marker_size,\n", - " )\n", - " # Plot the confidence interval.\n", - " contrast_axes.plot(\n", - " [position, position],\n", - " [ci_low, ci_high],\n", - " linestyle=\"-\",\n", - " color=ytick_color,\n", - " linewidth=group_summary_kwargs[\"lw\"],\n", - " )\n", - " if show_mini_meta:\n", - " contrast_xtick_labels.extend([\"\", \"Weighted delta\"])\n", - " elif effect_size == \"delta_g\":\n", - " contrast_xtick_labels.extend([\"\", \"deltas' g\"])\n", - " else:\n", - " contrast_xtick_labels.extend([\"\", \"delta-delta\"])\n", + " contrast_xtick_labels = plot_minimeta_or_deltadelta_violins(show_mini_meta=show_mini_meta, effectsize_df=effectsize_df, \n", + " ci_type=ci_type, rawdata_axes=rawdata_axes,contrast_axes=contrast_axes, \n", + " violinplot_kwargs=violinplot_kwargs, halfviolin_alpha=halfviolin_alpha, \n", + " ytick_color=ytick_color, es_marker_size=es_marker_size, group_summary_kwargs=group_summary_kwargs, \n", + " contrast_xtick_labels=contrast_xtick_labels, effect_size=effect_size\n", + " )\n", + "\n", + " # if show_mini_meta:\n", + " # mini_meta_delta = effectsize_df.mini_meta_delta\n", + " # data = mini_meta_delta.bootstraps_weighted_delta\n", + " # difference = mini_meta_delta.difference\n", + " # if ci_type == \"bca\":\n", + " # ci_low = mini_meta_delta.bca_low\n", + " # ci_high = mini_meta_delta.bca_high\n", + " # else:\n", + " # ci_low = mini_meta_delta.pct_low\n", + " # ci_high = mini_meta_delta.pct_high\n", + " # else:\n", + " # delta_delta = effectsize_df.delta_delta\n", + " # data = delta_delta.bootstraps_delta_delta\n", + " # difference = delta_delta.difference\n", + " # if ci_type == \"bca\":\n", + " # ci_low = delta_delta.bca_low\n", + " # ci_high = delta_delta.bca_high\n", + " # else:\n", + " # ci_low = delta_delta.pct_low\n", + " # ci_high = delta_delta.pct_high\n", + " # # Create the violinplot.\n", + " # # New in v0.2.6: drop negative infinities before plotting.\n", + " # position = max(rawdata_axes.get_xticks()) + 2\n", + " # v = contrast_axes.violinplot(\n", + " # data[~np.isinf(data)], positions=[position], **violinplot_kwargs\n", + " # )\n", + "\n", + " # fc = \"grey\"\n", + "\n", + " # halfviolin(v, fill_color=fc, alpha=halfviolin_alpha)\n", + "\n", + " # # Plot the effect size.\n", + " # contrast_axes.plot(\n", + " # [position],\n", + " # difference,\n", + " # marker=\"o\",\n", + " # color=ytick_color,\n", + " # markersize=es_marker_size,\n", + " # )\n", + " # # Plot the confidence interval.\n", + " # contrast_axes.plot(\n", + " # [position, position],\n", + " # [ci_low, ci_high],\n", + " # linestyle=\"-\",\n", + " # color=ytick_color,\n", + " # linewidth=group_summary_kwargs[\"lw\"],\n", + " # )\n", + " # if show_mini_meta:\n", + " # contrast_xtick_labels.extend([\"\", \"Weighted delta\"])\n", + " # elif effect_size == \"delta_g\":\n", + " # contrast_xtick_labels.extend([\"\", \"deltas' g\"])\n", + " # else:\n", + " # contrast_xtick_labels.extend([\"\", \"delta-delta\"])\n", "\n", " # Make sure the contrast_axes x-lims match the rawdata_axes xlims,\n", " # and add an extra violinplot tick for delta-delta plot.\n", @@ -1158,8 +1166,8 @@ " if contrast_bars:\n", " contrast_bars_plotter(results=results, ax_to_plot=contrast_axes, swarm_plot_ax=rawdata_axes,ticks_to_plot=ticks_to_plot, \n", " contrast_bars_kwargs=contrast_bars_kwargs, color_col=color_col, swarm_colors=swarm_colors, show_mini_meta=show_mini_meta, \n", - " mini_meta_delta=mini_meta_delta if show_mini_meta else None, show_delta2=show_delta2, \n", - " delta_delta=delta_delta if show_delta2 else None, proportional=proportional, is_paired=is_paired)\n", + " mini_meta_delta=effectsize_df.mini_meta_delta if show_mini_meta else None, show_delta2=show_delta2, \n", + " delta_delta=effectsize_df.delta_delta if show_delta2 else None, proportional=proportional, is_paired=is_paired)\n", "\n", " # Summary bars WIP\n", " summary_bars = plot_kwargs[\"summary_bars\"]\n", @@ -1172,8 +1180,8 @@ " if delta_text: \n", " delta_text_plotter(results=results, ax_to_plot=contrast_axes, swarm_plot_ax=rawdata_axes, ticks_to_plot=ticks_to_plot, delta_text_kwargs=delta_text_kwargs, color_col=color_col, swarm_colors=swarm_colors, \n", " is_paired=is_paired,proportional=proportional, float_contrast=float_contrast, show_mini_meta=show_mini_meta, \n", - " mini_meta_delta=mini_meta_delta if show_mini_meta else None, show_delta2=show_delta2, \n", - " delta_delta=delta_delta if show_delta2 else None)\n", + " mini_meta_delta=effectsize_df.mini_meta_delta if show_mini_meta else None, show_delta2=show_delta2, \n", + " delta_delta=effectsize_df.delta_delta if show_delta2 else None)\n", " ################################################### Swarm & Contrast & Summary Bars & Delta text WIP END\n", "\n", " # Make sure no stray ticks appear!\n",