Skip to content

Commit

Permalink
Fully functioning summary bars
Browse files Browse the repository at this point in the history
Added functionality for all use cases (as far as I can see). Need more testing.
  • Loading branch information
JAnns98 committed Apr 9, 2024
1 parent 7651923 commit 7bda513
Show file tree
Hide file tree
Showing 4 changed files with 121 additions and 25 deletions.
19 changes: 19 additions & 0 deletions dabest/_effsize_objects.py
Expand Up @@ -1017,6 +1017,11 @@ def plot(
fontsize_contrastxlabel=12,
fontsize_contrastylabel=12,
fontsize_delta2label=12,
#### Contrast bars WIP ####
contrast_bars=True,
swarm_bars=True,
contrast_bars_kwargs=None,
swarm_bars_kwargs=None,
):
"""
Creates an estimation plot for the effect size of interest.
Expand Down Expand Up @@ -1159,6 +1164,20 @@ def plot(
Font size for the contrast axes ylabel.
fontsize_delta2label : float, default 12
Font size for the delta-delta axes ylabel.
contrast_bars : boolean, default True
Whether or not to display the contrast bars.
swarm_bars : boolean, default True
Whether or not to display the swarm bars.
contrast_bars_kwargs : dict, default None
Pass relevant keyword arguments to the contrast bars. Pass any keyword argumentd accepted by
matplotlib.patches.Rectangle here, as a string. If None, the following keywords are passed:
{"color": None, "alpha": 0.1}
swarm_bars_kwargs : dict, default None
Pass relevant keyword arguments to the swarm bars. Pass any keyword argumentd accepted by
matplotlib.patches.Rectangle here, as a string. If None, the following keywords are passed:
{"color": None, "alpha": 0.15}
Returns
Expand Down
62 changes: 62 additions & 0 deletions dabest/plotter.py
Expand Up @@ -8,6 +8,7 @@
import seaborn as sns
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import pandas as pd
import warnings
import logging
Expand Down Expand Up @@ -1589,6 +1590,67 @@ def effectsize_df_plotter(effectsize_df, **plot_kwargs):
contrast_axes.get_xaxis().set_visible(False)

####################################################### END GRIDKEY MAIN CODE WIP

################################################### Contrast Bars WIP

# Swarm Bars WIP
swarm_bars = plot_kwargs["swarm_bars"]
default_swarm_bars_kwargs = {"color": None, "alpha": 0.1}
if plot_kwargs["swarm_bars_kwargs"] is None:
swarm_bars_kwargs = default_swarm_bars_kwargs
else:
swarm_bars_kwargs = merge_two_dicts(default_swarm_bars_kwargs, plot_kwargs["swarm_bars_kwargs"])

if swarm_bars and not proportional:
# if is_paired:
# swarm_bar_xlocs_adjustleft = {'right': -0.2, 'left': -0.2, 'center': -0.2}
# swarm_bar_xlocs_adjustright = {'right': -0.1, 'left': -0.1, 'center': -0.1}
# else:
# swarm_bar_xlocs_adjustleft = {'right': 0, 'left': -0.4, 'center': -0.2}
# swarm_bar_xlocs_adjustright = {'right': -0.1, 'left': -0.1, 'center': -0.1}

if isinstance(plot_data[xvar].dtype, pd.CategoricalDtype):
swarm_bars_order = pd.unique(plot_data[xvar]).categories
else:
swarm_bars_order = pd.unique(plot_data[xvar])

swarm_means = plot_data.groupby(xvar)[yvar].mean().reindex(index=swarm_bars_order)
swarm_bar_colors = [swarm_bars_kwargs.get('color')]*(len(swarm_bars_order)+1) if swarm_bars_kwargs.get('color') is not None else ['black']*(len(swarm_bars_order)+1) if color_col is not None or is_paired else swarm_colors
swarm_bars_kwargs.pop('color')
for swarm_bars_x,swarm_bars_y,c in zip(np.arange(0,len(swarm_bars_order)+1,1), swarm_means, swarm_bar_colors):
rawdata_axes.add_patch(mpatches.Rectangle((swarm_bars_x-0.2,0),
0.5-0.1, swarm_bars_y, zorder=-1,color=c,**swarm_bars_kwargs))

else:
pass

# Contrast Bars WIP
contrast_bars = plot_kwargs["contrast_bars"]
default_contrast_bars_kwargs = {"color": None, "alpha": 0.15}
if plot_kwargs["contrast_bars_kwargs"] is None:
contrast_bars_kwargs = default_contrast_bars_kwargs
else:
contrast_bars_kwargs = merge_two_dicts(default_contrast_bars_kwargs, plot_kwargs["contrast_bars_kwargs"])
if contrast_bars and not float_contrast:
contrast_means = []
for j, tick in enumerate(ticks_to_plot):
contrast_means.append(results.difference[j])

contrast_bar_colors = [contrast_bars_kwargs.get('color')]*(len(ticks_to_plot)+1) if contrast_bars_kwargs.get('color') is not None else ['black']*(max(ticks_to_plot)+1) if color_col is not None or (proportional and is_paired) or is_paired else swarm_colors
contrast_bars_kwargs.pop('color')
for contrast_bars_x,contrast_bars_y in zip(ticks_to_plot, contrast_means):
contrast_axes.add_patch(mpatches.Rectangle((contrast_bars_x,0),0.25, contrast_bars_y, zorder=-1, color=contrast_bar_colors[contrast_bars_x], **contrast_bars_kwargs))

if show_mini_meta:
contrast_axes.add_patch(mpatches.Rectangle((max(rawdata_axes.get_xticks())+2,0),0.25, mini_meta_delta.difference, zorder=-1, color='black', **contrast_bars_kwargs))

if show_delta2:
contrast_axes.add_patch(mpatches.Rectangle((max(rawdata_axes.get_xticks())+2,0),0.25, delta_delta.difference, zorder=-1, color='black', **contrast_bars_kwargs))

else:
pass

################################################### Contrast Bars WIP

# Make sure no stray ticks appear!
rawdata_axes.xaxis.set_ticks_position("bottom")
Expand Down
10 changes: 6 additions & 4 deletions nbs/API/effsize_objects.ipynb
Expand Up @@ -1332,11 +1332,13 @@
" swarm_bars : boolean, default True\n",
" Whether or not to display the swarm bars.\n",
" contrast_bars_kwargs : dict, default None\n",
" Pass relevant keyword arguments to the contrast bars. If None, the following keywords are passed:\n",
" {\"color\": None, \"alpha\": 0.4}\n",
" Pass relevant keyword arguments to the contrast bars. Pass any keyword argumentd accepted by \n",
" matplotlib.patches.Rectangle here, as a string. If None, the following keywords are passed:\n",
" {\"color\": None, \"alpha\": 0.1}\n",
" swarm_bars_kwargs : dict, default None\n",
" Pass relevant keyword arguments to the swarm bars. If None, the following keywords are passed:\n",
" {\"color\": None, \"alpha\": 0.4}\n",
" Pass relevant keyword arguments to the swarm bars. Pass any keyword argumentd accepted by \n",
" matplotlib.patches.Rectangle here, as a string. If None, the following keywords are passed:\n",
" {\"color\": None, \"alpha\": 0.15}\n",
"\n",
"\n",
" Returns\n",
Expand Down
55 changes: 34 additions & 21 deletions nbs/API/plotter.ipynb
Expand Up @@ -1654,40 +1654,61 @@
" \n",
" # Swarm Bars WIP\n",
" swarm_bars = plot_kwargs[\"swarm_bars\"]\n",
" default_swarm_bars_kwargs = {\"color\": None, \"alpha\": 0.4}\n",
" default_swarm_bars_kwargs = {\"color\": None, \"alpha\": 0.1}\n",
" if plot_kwargs[\"swarm_bars_kwargs\"] is None:\n",
" swarm_bars_kwargs = default_swarm_bars_kwargs\n",
" else:\n",
" swarm_bars_kwargs = merge_two_dicts(default_swarm_bars_kwargs, plot_kwargs[\"swarm_bars_kwargs\"])\n",
"\n",
" if swarm_bars:\n",
" \n",
" if swarm_bars and not proportional:\n",
" # if is_paired:\n",
" # swarm_bar_xlocs_adjustleft = {'right': -0.2, 'left': -0.2, 'center': -0.2}\n",
" # swarm_bar_xlocs_adjustright = {'right': -0.1, 'left': -0.1, 'center': -0.1} \n",
" # else:\n",
" # swarm_bar_xlocs_adjustleft = {'right': 0, 'left': -0.4, 'center': -0.2}\n",
" # swarm_bar_xlocs_adjustright = {'right': -0.1, 'left': -0.1, 'center': -0.1}\n",
" \n",
" if isinstance(plot_data[xvar].dtype, pd.CategoricalDtype):\n",
" swarm_bars_order = pd.unique(plot_data[xvar]).categories\n",
" else:\n",
" swarm_bars_order = pd.unique(plot_data[xvar])\n",
"\n",
" means = data.groupby(xvar)[yvar].mean().reindex(index=swarm_bars_order)\n",
" for swarm_bars_x,swarm_bars_y in zip(np.arange(0,len(swarm_bars_order)+1,1), means):\n",
" rawdata_axes.add_patch(mpatches.Rectangle((swarm_bars_x,0),0.5, swarm_bars_y) **swarm_bars_kwargs)\n",
" swarm_means = plot_data.groupby(xvar)[yvar].mean().reindex(index=swarm_bars_order)\n",
" swarm_bar_colors = [swarm_bars_kwargs.get('color')]*(len(swarm_bars_order)+1) if swarm_bars_kwargs.get('color') is not None else ['black']*(len(swarm_bars_order)+1) if color_col is not None or is_paired else swarm_colors\n",
" swarm_bars_kwargs.pop('color')\n",
" for swarm_bars_x,swarm_bars_y,c in zip(np.arange(0,len(swarm_bars_order)+1,1), swarm_means, swarm_bar_colors):\n",
" rawdata_axes.add_patch(mpatches.Rectangle((swarm_bars_x-0.2,0),\n",
" 0.5-0.1, swarm_bars_y, zorder=-1,color=c,**swarm_bars_kwargs))\n",
"\n",
" else:\n",
" pass\n",
" \n",
" # Contrast Bars WIP\n",
" contrast_bars = plot_kwargs[\"contrast_bars\"]\n",
" default_contrast_bars_kwargs = {\"color\": None, \"alpha\": 0.4}\n",
" if plot_kwargs[\"swarm_bars_kwargs\"] is None:\n",
" default_contrast_bars_kwargs = {\"color\": None, \"alpha\": 0.15}\n",
" if plot_kwargs[\"contrast_bars_kwargs\"] is None:\n",
" contrast_bars_kwargs = default_contrast_bars_kwargs\n",
" else:\n",
" contrast_bars_kwargs = merge_two_dicts(default_contrast_bars_kwargs, plot_kwargs[\"contrast_bars_kwargs\"])\n",
" if contrast_bars:\n",
" print('Contrast bars are WIP')\n",
" # for contrast_bars_x,contrast_bars_y in zip():\n",
" # contrast_axes.add_patch(mpatches.Rectangle((contrast_bars_x,0),0.5, place_holder_contrast_means[contrast_bars_y]) **contrast_bars_kwargs)\n",
" if contrast_bars and not float_contrast:\n",
" contrast_means = []\n",
" for j, tick in enumerate(ticks_to_plot):\n",
" contrast_means.append(results.difference[j])\n",
"\n",
" contrast_bar_colors = [contrast_bars_kwargs.get('color')]*(len(ticks_to_plot)+1) if contrast_bars_kwargs.get('color') is not None else ['black']*(max(ticks_to_plot)+1) if color_col is not None or (proportional and is_paired) or is_paired else swarm_colors\n",
" contrast_bars_kwargs.pop('color')\n",
" for contrast_bars_x,contrast_bars_y in zip(ticks_to_plot, contrast_means):\n",
" contrast_axes.add_patch(mpatches.Rectangle((contrast_bars_x,0),0.25, contrast_bars_y, zorder=-1, color=contrast_bar_colors[contrast_bars_x], **contrast_bars_kwargs))\n",
"\n",
" if show_mini_meta:\n",
" contrast_axes.add_patch(mpatches.Rectangle((max(rawdata_axes.get_xticks())+2,0),0.25, mini_meta_delta.difference, zorder=-1, color='black', **contrast_bars_kwargs))\n",
"\n",
" if show_delta2:\n",
" contrast_axes.add_patch(mpatches.Rectangle((max(rawdata_axes.get_xticks())+2,0),0.25, delta_delta.difference, zorder=-1, color='black', **contrast_bars_kwargs))\n",
"\n",
" else:\n",
" pass\n",
" \n",
" \n",
" ################################################### Contrast Bars WIP\n",
"\n",
" # Make sure no stray ticks appear!\n",
Expand All @@ -1704,14 +1725,6 @@
" # Return the figure.\n",
" return fig\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "7355251f",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
Expand Down

0 comments on commit 7bda513

Please sign in to comment.