diff --git a/dabest/misc_tools.py b/dabest/misc_tools.py index 23a3044..086a8cd 100644 --- a/dabest/misc_tools.py +++ b/dabest/misc_tools.py @@ -696,7 +696,7 @@ def set_xaxis_ticks_and_lims(show_delta2, show_mini_meta, rawdata_axes, contrast contrast_axes.set_yticks(rawdata_axes.get_yticks()) else: temp = rawdata_axes.get_yticks() - temp = np.append(temp, [max(temp) + 1, max(temp) + 2]) + temp = np.append(temp, [max(temp) + 0, max(temp) + 1]) contrast_axes.set_yticks(temp) if show_pairs: @@ -707,24 +707,13 @@ def set_xaxis_ticks_and_lims(show_delta2, show_mini_meta, rawdata_axes, contrast # Increase the xlim of raw data by 2 temp = rawdata_axes.get_ylim() if show_pairs: - rawdata_axes.set_ylim(temp[0], temp[1] + 0.25) + rawdata_axes.set_ylim(temp[0], temp[1] + 0.00) else: - rawdata_axes.set_ylim(temp[0], temp[1] + 2) + rawdata_axes.set_ylim(temp[0], temp[1] + 1) contrast_axes.set_ylim(rawdata_axes.get_ylim()) else: contrast_axes.set_ylim(rawdata_axes.get_ylim()) - # Properly label the contrast ticks. - # for t in ticks_to_skip: - # contrast_xtick_labels.insert(t, "") - - # if plot_kwargs["fontsize_contrastxlabel"] is not None: - # fontsize_contrastxlabel = plot_kwargs["fontsize_contrastxlabel"] - - # contrast_axes.set_yticklabels( - # contrast_xtick_labels, fontsize=fontsize_contrastxlabel - # ) - else: if show_delta2 is False and show_mini_meta is False: contrast_axes.set_xticks(rawdata_axes.get_xticks()) @@ -1178,7 +1167,7 @@ def Cumming_Plot_Aesthetic_Adjustments(plot_kwargs, show_delta2, effect_size_typ def General_Plot_Aesthetic_Adjustments(show_delta2, show_mini_meta, contrast_axes, redraw_axes_kwargs, plot_kwargs, yvar, effect_size_type, proportional, effectsize_df, is_paired, float_contrast, - rawdata_axes, og_ylim_raw, effect_size, horizontal=False): + rawdata_axes, og_ylim_raw, effect_size, show_pairs, horizontal=False): if (show_delta2 or show_mini_meta) and not horizontal: @@ -1270,12 +1259,12 @@ def General_Plot_Aesthetic_Adjustments(show_delta2, show_mini_meta, contrast_axe delta2_label = "delta - delta" else: delta2_label = "deltas' g" - raise NotImplementedError("Delta2 is not yet supported for horizontal plots.") # Set custom ylims, if they were specified. swarm_ylim = plot_kwargs["swarm_ylim"] contrast_ylim = plot_kwargs["contrast_ylim"] - if not proportional: + + if not proportional or (proportional and show_pairs): if swarm_ylim is None: swarm_ylim = rawdata_axes.get_ylim() rawdata_axes.set_ylim(swarm_ylim[1], swarm_ylim[0]) diff --git a/dabest/plot_tools.py b/dabest/plot_tools.py index 6f92b69..8684310 100644 --- a/dabest/plot_tools.py +++ b/dabest/plot_tools.py @@ -957,10 +957,10 @@ def contrast_bars_plotter(results: object, ax_to_plot: object, swarm_plot_ax: o ax_to_plot.add_patch(mpatches.Rectangle((0,contrast_bars_x-0.5),contrast_bars_y, 0.5, zorder=-10, color=contrast_bars_colors[contrast_bars_x], **contrast_bars_kwargs)) if show_mini_meta: - ax_to_plot.add_patch(mpatches.Rectangle((0, max(swarm_plot_ax.get_yticks())+2-0.5), mini_meta_delta.difference, 0.5, zorder=-10, color='black', **contrast_bars_kwargs)) + ax_to_plot.add_patch(mpatches.Rectangle((0, max(swarm_plot_ax.get_yticks())-0.5), mini_meta_delta.difference, 0.5, zorder=-10, color='black', **contrast_bars_kwargs)) if show_delta2: - ax_to_plot.add_patch(mpatches.Rectangle((0, max(swarm_plot_ax.get_yticks())+2-0.5), delta_delta.difference, 0.5, zorder=-10, color='black', **contrast_bars_kwargs)) + ax_to_plot.add_patch(mpatches.Rectangle((0, max(swarm_plot_ax.get_yticks())-0.5), delta_delta.difference, 0.5, zorder=-10, color='black', **contrast_bars_kwargs)) else: for contrast_bars_x,contrast_bars_y in zip(ticks_to_plot, contrast_means): @@ -1250,7 +1250,8 @@ def slopegraph_plotter(dabest_obj, plot_data, xvar, yvar, color_col, plot_palett 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 + es_marker_size, group_summary_kwargs, contrast_xtick_labels, effect_size, + horizontal=False ): if show_mini_meta: mini_meta_delta = effectsize_df.mini_meta_delta @@ -1272,39 +1273,73 @@ def plot_minimeta_or_deltadelta_violins(show_mini_meta, effectsize_df, ci_type, 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) + if horizontal: + position = max(rawdata_axes.get_yticks()) + 2 + violinplot_kwargs.update({'vert': False, 'widths': 1}) + v = contrast_axes.violinplot( + data[~np.isinf(data)], positions=[position], **violinplot_kwargs + ) + half = "bottom" + effsize_y = [position] + ci_y = [position, position] + effsize_x = difference + ci_x = [ci_low, ci_high] + + else: + position = max(rawdata_axes.get_xticks()) + 2 + v = contrast_axes.violinplot( + data[~np.isinf(data)], positions=[position], **violinplot_kwargs + ) + half = "right" + effsize_x = [position] + ci_x = [position, position] + effsize_y = difference + ci_y = [ci_low, ci_high] + + halfviolin(v, fill_color=fc, alpha=halfviolin_alpha, half=half) # Plot the effect size. contrast_axes.plot( - [position], - difference, + effsize_x, + effsize_y, marker="o", color=ytick_color, markersize=es_marker_size, ) # Plot the confidence interval. contrast_axes.plot( - [position, position], - [ci_low, ci_high], + ci_x, + ci_y, 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"]) + + if horizontal: + current_yticks = rawdata_axes.get_yticks() + current_yticks = np.append(current_yticks, position) + current_ylabels = rawdata_axes.get_yticklabels() + if show_mini_meta: + current_ylabels.extend(["Weighted delta"]) + elif effect_size == "delta_g": + current_ylabels.extend(["deltas' g"]) + else: + current_ylabels.extend(["delta-delta"]) + + rawdata_axes.set_yticks(current_yticks) + rawdata_axes.set_yticklabels(current_ylabels) + else: - contrast_xtick_labels.extend(["", "delta-delta"]) + 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 @@ -1615,12 +1650,17 @@ def table_for_horizontal_plots(effectsize_df, ax, contrast_axes, ticks_to_plot, ### Plot the text - for i,loc in zip(tab.index, ticks_to_plot): - if show_mini_meta or show_delta2: - loc_new = loc if loc != 0.25 else loc+0.25 - ax.text(0.5, loc_new, "{:+.2f}".format(tab.iloc[i,0])+text_units,ha="center", va="center", color=table_text_color,size=table_font_size) - else: - ax.text(0.5, loc, "{:+.2f}".format(tab.iloc[i,0])+text_units,ha="center", va="center", color=table_text_color,size=table_font_size) + if show_mini_meta or show_delta2: + new_ticks = ticks_to_plot + [max(ticks_to_plot)+2] + else: + new_ticks = ticks_to_plot.copy() + for i,loc in zip(tab.index, new_ticks): + ax.text(0.5, loc, "{:+.2f}".format(tab.iloc[i,0])+text_units,ha="center", va="center", color=table_text_color,size=table_font_size) + # if show_mini_meta or show_delta2: + # loc_new = loc if loc != 0.25 else loc+0.25 + # ax.text(0.5, loc_new, "{:+.2f}".format(tab.iloc[i,0])+text_units,ha="center", va="center", color=table_text_color,size=table_font_size) + # else: + # ax.text(0.5, loc, "{:+.2f}".format(tab.iloc[i,0])+text_units,ha="center", va="center", color=table_text_color,size=table_font_size) # ### Plot the dashes # if show_mini_meta or show_delta2: diff --git a/dabest/plotter.py b/dabest/plotter.py index bb7970d..5970f9f 100644 --- a/dabest/plotter.py +++ b/dabest/plotter.py @@ -481,6 +481,7 @@ def effectsize_df_plotter(effectsize_df, **plot_kwargs): rawdata_axes=rawdata_axes, og_ylim_raw=og_ylim_raw, effect_size=effect_size, + show_pairs=show_pairs, ) ################################################### GRIDKEY WIP @@ -657,6 +658,7 @@ def effectsize_df_plotter_horizontal(effectsize_df, **plot_kwargs): effectsize_df=effectsize_df, plot_kwargs=plot_kwargs ) + if plot_kwargs['horizontal']: float_contrast = False @@ -757,11 +759,9 @@ def effectsize_df_plotter_horizontal(effectsize_df, **plot_kwargs): rawdata_axes.set_yticks(np.arange(0, len(temp_all_plot_groups))) rawdata_axes.set_yticklabels(temp_all_plot_groups) - # rawdata_axes.set_yticklabels(temp_all_plot_groups[::-1]) - else: # Plot the raw data as a set of Sankey Diagrams aligned like barplot. - raise NotImplementedError("Sankey Diagrams for horizontal plots are not implemented yet.") + # raise NotImplementedError("Sankey Diagrams for horizontal plots are not implemented yet.") sankey_control_group, sankey_test_group = sankeydiag( plot_data, xvar=xvar, @@ -949,7 +949,8 @@ def effectsize_df_plotter_horizontal(effectsize_df, **plot_kwargs): es_marker_size=es_marker_size, group_summary_kwargs=group_summary_kwargs, contrast_xtick_labels=contrast_xtick_labels, - effect_size=effect_size + effect_size=effect_size, + horizontal=True ) @@ -1035,6 +1036,7 @@ def effectsize_df_plotter_horizontal(effectsize_df, **plot_kwargs): rawdata_axes=rawdata_axes, og_ylim_raw=og_xlim_raw if plot_kwargs['horizontal'] else og_ylim_raw, effect_size=effect_size, + show_pairs=show_pairs, horizontal=True, ) diff --git a/nbs/API/misc_tools.ipynb b/nbs/API/misc_tools.ipynb index d2be752..6c0757f 100644 --- a/nbs/API/misc_tools.ipynb +++ b/nbs/API/misc_tools.ipynb @@ -751,7 +751,7 @@ " contrast_axes.set_yticks(rawdata_axes.get_yticks())\n", " else:\n", " temp = rawdata_axes.get_yticks()\n", - " temp = np.append(temp, [max(temp) + 1, max(temp) + 2])\n", + " temp = np.append(temp, [max(temp) + 0, max(temp) + 1])\n", " contrast_axes.set_yticks(temp) \n", "\n", " if show_pairs:\n", @@ -762,24 +762,13 @@ " # Increase the xlim of raw data by 2\n", " temp = rawdata_axes.get_ylim()\n", " if show_pairs:\n", - " rawdata_axes.set_ylim(temp[0], temp[1] + 0.25)\n", + " rawdata_axes.set_ylim(temp[0], temp[1] + 0.00)\n", " else:\n", - " rawdata_axes.set_ylim(temp[0], temp[1] + 2)\n", + " rawdata_axes.set_ylim(temp[0], temp[1] + 1)\n", " contrast_axes.set_ylim(rawdata_axes.get_ylim())\n", " else:\n", " contrast_axes.set_ylim(rawdata_axes.get_ylim())\n", "\n", - " # Properly label the contrast ticks.\n", - " # for t in ticks_to_skip:\n", - " # contrast_xtick_labels.insert(t, \"\")\n", - "\n", - " # if plot_kwargs[\"fontsize_contrastxlabel\"] is not None:\n", - " # fontsize_contrastxlabel = plot_kwargs[\"fontsize_contrastxlabel\"]\n", - "\n", - " # contrast_axes.set_yticklabels(\n", - " # contrast_xtick_labels, fontsize=fontsize_contrastxlabel\n", - " # )\n", - "\n", " else:\n", " if show_delta2 is False and show_mini_meta is False:\n", " contrast_axes.set_xticks(rawdata_axes.get_xticks())\n", @@ -1233,7 +1222,7 @@ "\n", "def General_Plot_Aesthetic_Adjustments(show_delta2, show_mini_meta, contrast_axes, redraw_axes_kwargs, plot_kwargs,\n", " yvar, effect_size_type, proportional, effectsize_df, is_paired, float_contrast,\n", - " rawdata_axes, og_ylim_raw, effect_size, horizontal=False):\n", + " rawdata_axes, og_ylim_raw, effect_size, show_pairs, horizontal=False):\n", "\n", "\n", " if (show_delta2 or show_mini_meta) and not horizontal:\n", @@ -1325,12 +1314,12 @@ " delta2_label = \"delta - delta\"\n", " else:\n", " delta2_label = \"deltas' g\"\n", - " raise NotImplementedError(\"Delta2 is not yet supported for horizontal plots.\")\n", " \n", " # Set custom ylims, if they were specified.\n", " swarm_ylim = plot_kwargs[\"swarm_ylim\"]\n", " contrast_ylim = plot_kwargs[\"contrast_ylim\"]\n", - " if not proportional:\n", + "\n", + " if not proportional or (proportional and show_pairs):\n", " if swarm_ylim is None:\n", " swarm_ylim = rawdata_axes.get_ylim()\n", " rawdata_axes.set_ylim(swarm_ylim[1], swarm_ylim[0])\n", diff --git a/nbs/API/plot_tools.ipynb b/nbs/API/plot_tools.ipynb index 6cbf5b8..6125277 100644 --- a/nbs/API/plot_tools.ipynb +++ b/nbs/API/plot_tools.ipynb @@ -1009,10 +1009,10 @@ " ax_to_plot.add_patch(mpatches.Rectangle((0,contrast_bars_x-0.5),contrast_bars_y, 0.5, zorder=-10, color=contrast_bars_colors[contrast_bars_x], **contrast_bars_kwargs))\n", "\n", " if show_mini_meta:\n", - " ax_to_plot.add_patch(mpatches.Rectangle((0, max(swarm_plot_ax.get_yticks())+2-0.5), mini_meta_delta.difference, 0.5, zorder=-10, color='black', **contrast_bars_kwargs))\n", + " ax_to_plot.add_patch(mpatches.Rectangle((0, max(swarm_plot_ax.get_yticks())-0.5), mini_meta_delta.difference, 0.5, zorder=-10, color='black', **contrast_bars_kwargs))\n", "\n", " if show_delta2:\n", - " ax_to_plot.add_patch(mpatches.Rectangle((0, max(swarm_plot_ax.get_yticks())+2-0.5), delta_delta.difference, 0.5, zorder=-10, color='black', **contrast_bars_kwargs))\n", + " ax_to_plot.add_patch(mpatches.Rectangle((0, max(swarm_plot_ax.get_yticks())-0.5), delta_delta.difference, 0.5, zorder=-10, color='black', **contrast_bars_kwargs))\n", "\n", " else:\n", " for contrast_bars_x,contrast_bars_y in zip(ticks_to_plot, contrast_means):\n", @@ -1302,7 +1302,8 @@ "\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", + " es_marker_size, group_summary_kwargs, contrast_xtick_labels, effect_size,\n", + " horizontal=False\n", " ):\n", " if show_mini_meta:\n", " mini_meta_delta = effectsize_df.mini_meta_delta\n", @@ -1324,39 +1325,73 @@ " 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", + " \n", " fc = \"grey\"\n", "\n", - " halfviolin(v, fill_color=fc, alpha=halfviolin_alpha)\n", + " if horizontal: \n", + " position = max(rawdata_axes.get_yticks()) + 2\n", + " violinplot_kwargs.update({'vert': False, 'widths': 1})\n", + " v = contrast_axes.violinplot(\n", + " data[~np.isinf(data)], positions=[position], **violinplot_kwargs\n", + " )\n", + " half = \"bottom\"\n", + " effsize_y = [position]\n", + " ci_y = [position, position]\n", + " effsize_x = difference\n", + " ci_x = [ci_low, ci_high]\n", + "\n", + " else:\n", + " position = max(rawdata_axes.get_xticks()) + 2\n", + " v = contrast_axes.violinplot(\n", + " data[~np.isinf(data)], positions=[position], **violinplot_kwargs\n", + " )\n", + " half = \"right\"\n", + " effsize_x = [position]\n", + " ci_x = [position, position]\n", + " effsize_y = difference\n", + " ci_y = [ci_low, ci_high]\n", + "\n", + " halfviolin(v, fill_color=fc, alpha=halfviolin_alpha, half=half)\n", "\n", " # Plot the effect size.\n", " contrast_axes.plot(\n", - " [position],\n", - " difference,\n", + " effsize_x,\n", + " effsize_y,\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", + " ci_x,\n", + " ci_y,\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", + "\n", + " if horizontal:\n", + " current_yticks = rawdata_axes.get_yticks()\n", + " current_yticks = np.append(current_yticks, position)\n", + " current_ylabels = rawdata_axes.get_yticklabels()\n", + " if show_mini_meta:\n", + " current_ylabels.extend([\"Weighted delta\"])\n", + " elif effect_size == \"delta_g\":\n", + " current_ylabels.extend([\"deltas' g\"])\n", + " else:\n", + " current_ylabels.extend([\"delta-delta\"])\n", + "\n", + " rawdata_axes.set_yticks(current_yticks)\n", + " rawdata_axes.set_yticklabels(current_ylabels)\n", + "\n", " else:\n", - " contrast_xtick_labels.extend([\"\", \"delta-delta\"])\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", "\n", @@ -1667,12 +1702,17 @@ "\n", "\n", " ### Plot the text\n", - " for i,loc in zip(tab.index, ticks_to_plot):\n", - " if show_mini_meta or show_delta2:\n", - " loc_new = loc if loc != 0.25 else loc+0.25\n", - " ax.text(0.5, loc_new, \"{:+.2f}\".format(tab.iloc[i,0])+text_units,ha=\"center\", va=\"center\", color=table_text_color,size=table_font_size)\n", - " else:\n", - " ax.text(0.5, loc, \"{:+.2f}\".format(tab.iloc[i,0])+text_units,ha=\"center\", va=\"center\", color=table_text_color,size=table_font_size)\n", + " if show_mini_meta or show_delta2:\n", + " new_ticks = ticks_to_plot + [max(ticks_to_plot)+2]\n", + " else:\n", + " new_ticks = ticks_to_plot.copy()\n", + " for i,loc in zip(tab.index, new_ticks):\n", + " ax.text(0.5, loc, \"{:+.2f}\".format(tab.iloc[i,0])+text_units,ha=\"center\", va=\"center\", color=table_text_color,size=table_font_size)\n", + " # if show_mini_meta or show_delta2:\n", + " # loc_new = loc if loc != 0.25 else loc+0.25\n", + " # ax.text(0.5, loc_new, \"{:+.2f}\".format(tab.iloc[i,0])+text_units,ha=\"center\", va=\"center\", color=table_text_color,size=table_font_size)\n", + " # else:\n", + " # ax.text(0.5, loc, \"{:+.2f}\".format(tab.iloc[i,0])+text_units,ha=\"center\", va=\"center\", color=table_text_color,size=table_font_size)\n", "\n", " # ### Plot the dashes\n", " # if show_mini_meta or show_delta2:\n", diff --git a/nbs/API/plotter.ipynb b/nbs/API/plotter.ipynb index 87c03c1..b1dd1b1 100644 --- a/nbs/API/plotter.ipynb +++ b/nbs/API/plotter.ipynb @@ -540,6 +540,7 @@ " rawdata_axes=rawdata_axes, \n", " og_ylim_raw=og_ylim_raw, \n", " effect_size=effect_size,\n", + " show_pairs=show_pairs,\n", " )\n", "\n", " ################################################### GRIDKEY WIP\n", @@ -764,6 +765,7 @@ " effectsize_df=effectsize_df, \n", " plot_kwargs=plot_kwargs\n", " )\n", + " \n", " if plot_kwargs['horizontal']:\n", " float_contrast = False\n", " \n", @@ -864,11 +866,9 @@ " rawdata_axes.set_yticks(np.arange(0, len(temp_all_plot_groups)))\n", " rawdata_axes.set_yticklabels(temp_all_plot_groups)\n", "\n", - " # rawdata_axes.set_yticklabels(temp_all_plot_groups[::-1])\n", - "\n", " else:\n", " # Plot the raw data as a set of Sankey Diagrams aligned like barplot.\n", - " raise NotImplementedError(\"Sankey Diagrams for horizontal plots are not implemented yet.\")\n", + " # raise NotImplementedError(\"Sankey Diagrams for horizontal plots are not implemented yet.\")\n", " sankey_control_group, sankey_test_group = sankeydiag(\n", " plot_data,\n", " xvar=xvar,\n", @@ -1056,7 +1056,8 @@ " es_marker_size=es_marker_size, \n", " group_summary_kwargs=group_summary_kwargs, \n", " contrast_xtick_labels=contrast_xtick_labels, \n", - " effect_size=effect_size\n", + " effect_size=effect_size,\n", + " horizontal=True\n", " )\n", "\n", "\n", @@ -1142,6 +1143,7 @@ " rawdata_axes=rawdata_axes, \n", " og_ylim_raw=og_xlim_raw if plot_kwargs['horizontal'] else og_ylim_raw, \n", " effect_size=effect_size,\n", + " show_pairs=show_pairs,\n", " horizontal=True,\n", " )\n", " \n",