Skip to content

Commit

Permalink
Moved delta dots to a separate function in plot_tools and renamed and…
Browse files Browse the repository at this point in the history
… edited the code
  • Loading branch information
JAnns98 committed Sep 6, 2024
1 parent 3c54561 commit 2982292
Show file tree
Hide file tree
Showing 7 changed files with 212 additions and 151 deletions.
10 changes: 8 additions & 2 deletions dabest/_effsize_objects.py
Original file line number Diff line number Diff line change
Expand Up @@ -994,7 +994,6 @@ def plot(
fig_size=None,
dpi=100,
ax=None,
contrast_show_deltas=True,
gridkey_rows=None,
gridkey_merge_pairs=False,
gridkey_show_Ns=True,
Expand All @@ -1014,7 +1013,7 @@ def plot(
fontsize_contrastxlabel=12,
fontsize_contrastylabel=12,
fontsize_delta2label=12,
#### Contrast bars WIP ####
#### Contrast bars and delta text and delta dots WIP ####
contrast_bars=True,
swarm_bars=True,
contrast_bars_kwargs=None,
Expand All @@ -1023,6 +1022,8 @@ def plot(
summary_bars_kwargs=None,
delta_text=True,
delta_text_kwargs=None,
delta_dot=True,
delta_dot_kwargs=None,
):
"""
Creates an estimation plot for the effect size of interest.
Expand Down Expand Up @@ -1193,6 +1194,11 @@ def plot(
{"color": None, "alpha": 1, "fontsize": 10, "ha": 'center', "va": 'center', "rotation": 0,
"x_location": 'right', "x_coordinates": None, "y_coordinates": None}
Use "x_coordinates" and "y_coordinates" if you would like to specify the text locations manually.
delta_dot : boolean, default True
Whether or not to display the delta dots on paired or repeated measure plots.
delta_dot_kwargs : dict, default None
Pass relevant keyword arguments. If None, the following keywords are passed:
{"marker": "^", "alpha": 0.5}
Returns
-------
Expand Down
3 changes: 2 additions & 1 deletion dabest/_modidx.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@
'dabest.misc_tools.merge_two_dicts': ('API/misc_tools.html#merge_two_dicts', 'dabest/misc_tools.py'),
'dabest.misc_tools.print_greeting': ('API/misc_tools.html#print_greeting', 'dabest/misc_tools.py'),
'dabest.misc_tools.unpack_and_add': ('API/misc_tools.html#unpack_and_add', 'dabest/misc_tools.py')},
'dabest.plot_tools': { 'dabest.plot_tools.SwarmPlot': ('API/plot_tools.html#swarmplot', 'dabest/plot_tools.py'),
'dabest.plot_tools': { 'dabest.plot_tools.DeltaDotsPlotter': ('API/plot_tools.html#deltadotsplotter', 'dabest/plot_tools.py'),
'dabest.plot_tools.SwarmPlot': ('API/plot_tools.html#swarmplot', 'dabest/plot_tools.py'),
'dabest.plot_tools.SwarmPlot.__init__': ( 'API/plot_tools.html#swarmplot.__init__',
'dabest/plot_tools.py'),
'dabest.plot_tools.SwarmPlot._adjust_gutter_points': ( 'API/plot_tools.html#swarmplot._adjust_gutter_points',
Expand Down
84 changes: 83 additions & 1 deletion dabest/plot_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
# %% 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', 'swarmplot', 'SwarmPlot']
'delta_text_plotter', 'DeltaDotsPlotter', 'swarmplot', 'SwarmPlot']

# %% ../nbs/API/plot_tools.ipynb 4
import math
Expand Down Expand Up @@ -1029,6 +1029,88 @@ def delta_text_plotter(results: object, ax_to_plot: object, swarm_plot_ax: objec
Delta_Text = np.format_float_positional(t, precision=2, sign=True, trim="k", min_digits=2)
ax_to_plot.text(x, y, Delta_Text, color=delta_text_colors[tick], zorder=5, **delta_text_kwargs)


def DeltaDotsPlotter(plot_data, contrast_axes, delta_id_col, idx, xvar, yvar, is_paired, color_col, float_contrast, plot_palette_raw, delta_dot_kwargs):
"""
Parameters
----------
plot_data : object (Dataframe)
Dataframe of the plot data.
contrast_axes : object
Matplotlib axis object to plot on.
delta_id_col : str
Column name of the delta id column.
idx : list
List of indices of the contrast objects.
xvar : str
Column name of the x variable.
yvar : str
Column name of the y variable.
is_paired : bool
Whether the data is paired.
color_col : str
Column name of the color column.
float_contrast : bool
Whether the DABEST plot uses Gardner-Altman or Cummings
plot_palette_raw : list
List of colors used in the plot.
delta_dot_kwargs : dict
Keyword arguments for the delta dots.
"""

# Checks and initializations
from .plot_tools import swarmplot

if color_col is not None:
plot_palette_deltapts = plot_palette_raw
delta_plot_data = plot_data[[xvar, yvar, delta_id_col, color_col]]
else:
plot_palette_deltapts = "k"
delta_plot_data = plot_data[[xvar, yvar, delta_id_col]]

# TODO: to make jitter value more accurate and not just a hardcoded eyeball value
jitter = 0.6 if float_contrast else 1

# Create dataframe of delta values
final_deltas = pd.DataFrame()
for i in idx:
for j in i:
if i.index(j) != 0:
temp_df_exp = delta_plot_data[
delta_plot_data[xvar].str.contains(j)
].reset_index(drop=True)
if is_paired == "baseline":
temp_df_cont = delta_plot_data[
delta_plot_data[xvar].str.contains(i[0])
].reset_index(drop=True)
elif is_paired == "sequential":
temp_df_cont = delta_plot_data[
delta_plot_data[xvar].str.contains(
i[i.index(j) - 1]
)
].reset_index(drop=True)
delta_df = temp_df_exp.copy()
delta_df[yvar] = temp_df_exp[yvar] - temp_df_cont[yvar]
final_deltas = pd.concat([final_deltas, delta_df])

# Plot the delta dots
swarmplot(
data=final_deltas,
x=xvar,
y=yvar,
ax=contrast_axes,
order=None,
hue=color_col,
palette=plot_palette_deltapts,
zorder=2,
size=3,
side="right",
jitter=jitter,
is_drop_gutter=True,
gutter_limit=1,
**delta_dot_kwargs)
contrast_axes.legend().set_visible(False)

# %% ../nbs/API/plot_tools.ipynb 6
def swarmplot(
data: pd.DataFrame,
Expand Down
86 changes: 14 additions & 72 deletions dabest/plotter.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ def effectsize_df_plotter(effectsize_df, **plot_kwargs):
swarm_bars=True, swarm_bars_kwargs=None,
contrast_bars=True, contrast_bars_kwargs=None,
delta_text=True, delta_text_kwargs=None,
delta_dot=True, delta_dot_kwargs=None,
"""
from .misc_tools import merge_two_dicts
from .plot_tools import (
Expand All @@ -69,6 +70,7 @@ def effectsize_df_plotter(effectsize_df, **plot_kwargs):
contrast_bars_plotter,
summary_bars_plotter,
delta_text_plotter,
DeltaDotsPlotter,
)
from ._stats_tools.effsize import (
_compute_standardizers,
Expand Down Expand Up @@ -509,80 +511,20 @@ def effectsize_df_plotter(effectsize_df, **plot_kwargs):

x_start = x_start + grp_count

##################### DELTA PTS ON CONTRAST PLOT WIP

contrast_show_deltas = plot_kwargs["contrast_show_deltas"]

if is_paired is None:
contrast_show_deltas = False

if contrast_show_deltas:
delta_plot_data_temp = plot_data.copy()
delta_id_col = dabest_obj.id_col
if color_col is not None:
plot_palette_deltapts = plot_palette_raw
delta_plot_data = delta_plot_data_temp[
[xvar, yvar, delta_id_col, color_col]
]
deltapts_args = {
"marker": "^",
"alpha": 0.5,
}

else:
plot_palette_deltapts = "k"
delta_plot_data = delta_plot_data_temp[[xvar, yvar, delta_id_col]]
deltapts_args = {"marker": "^", "alpha": 0.5}

final_deltas = pd.DataFrame()
for i in idx:
for j in i:
if i.index(j) != 0:
temp_df_exp = delta_plot_data[
delta_plot_data[xvar].str.contains(j)
].reset_index(drop=True)
if is_paired == "baseline":
temp_df_cont = delta_plot_data[
delta_plot_data[xvar].str.contains(i[0])
].reset_index(drop=True)
elif is_paired == "sequential":
temp_df_cont = delta_plot_data[
delta_plot_data[xvar].str.contains(
i[i.index(j) - 1]
)
].reset_index(drop=True)
delta_df = temp_df_exp.copy()
delta_df[yvar] = temp_df_exp[yvar] - temp_df_cont[yvar]
final_deltas = pd.concat([final_deltas, delta_df])

# swarmplot() plots swarms based on current size of ax
# Therefore, since the ax size for Gardner-Altman plot changes later on, there has to be decreased jitter
# TODO: to make jitter value more accurate and not just a hardcoded eyeball value
if float_contrast:
jitter = 0.6
else:
jitter = 1

# Plot the raw data as a swarmplot.
deltapts_plot = swarmplot(
data=final_deltas,
x=xvar,
y=yvar,
ax=contrast_axes,
order=None,
hue=color_col,
palette=plot_palette_deltapts,
zorder=2,
size=3,
side="right",
jitter=jitter,
is_drop_gutter=True,
gutter_limit=1,
**deltapts_args
)
contrast_axes.legend().set_visible(False)
##################### DELTA PTS ON CONTRAST PLOT WIP
show_delta_dots = plot_kwargs["delta_dot"]
default_delta_dot_kwargs = {"marker": "^", "alpha": 0.5}
if plot_kwargs["delta_dot_kwargs"] is None:
delta_dot_kwargs = default_delta_dot_kwargs
else:
delta_dot_kwargs = merge_two_dicts(default_delta_dot_kwargs, plot_kwargs["delta_dot_kwargs"])

##################### DELTA PTS ON CONTRAST PLOT END
if show_delta_dots and is_paired is not None:
DeltaDotsPlotter(plot_data=plot_data, contrast_axes=contrast_axes, delta_id_col=dabest_obj.id_col,
idx=idx, xvar=xvar, yvar=yvar, is_paired=is_paired, color_col=color_col,
float_contrast=float_contrast, plot_palette_raw=plot_palette_raw, delta_dot_kwargs=delta_dot_kwargs)
##################### DELTA PTS ON CONTRAST PLOT WIP END

# Set the tick labels, because the slopegraph plotting doesn't.
rawdata_axes.set_xticks(np.arange(0, len(temp_all_plot_groups)))
Expand Down
10 changes: 8 additions & 2 deletions nbs/API/effsize_objects.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -1155,7 +1155,6 @@
" fig_size=None,\n",
" dpi=100,\n",
" ax=None,\n",
" contrast_show_deltas=True,\n",
" gridkey_rows=None,\n",
" gridkey_merge_pairs=False,\n",
" gridkey_show_Ns=True,\n",
Expand All @@ -1175,7 +1174,7 @@
" fontsize_contrastxlabel=12,\n",
" fontsize_contrastylabel=12,\n",
" fontsize_delta2label=12,\n",
" #### Contrast bars WIP ####\n",
" #### Contrast bars and delta text and delta dots WIP ####\n",
" contrast_bars=True,\n",
" swarm_bars=True,\n",
" contrast_bars_kwargs=None,\n",
Expand All @@ -1184,6 +1183,8 @@
" summary_bars_kwargs=None,\n",
" delta_text=True,\n",
" delta_text_kwargs=None,\n",
" delta_dot=True,\n",
" delta_dot_kwargs=None,\n",
" ):\n",
" \"\"\"\n",
" Creates an estimation plot for the effect size of interest.\n",
Expand Down Expand Up @@ -1354,6 +1355,11 @@
" {\"color\": None, \"alpha\": 1, \"fontsize\": 10, \"ha\": 'center', \"va\": 'center', \"rotation\": 0, \n",
" \"x_location\": 'right', \"x_coordinates\": None, \"y_coordinates\": None}\n",
" Use \"x_coordinates\" and \"y_coordinates\" if you would like to specify the text locations manually.\n",
" delta_dot : boolean, default True\n",
" Whether or not to display the delta dots on paired or repeated measure plots.\n",
" delta_dot_kwargs : dict, default None\n",
" Pass relevant keyword arguments. If None, the following keywords are passed:\n",
" {\"marker\": \"^\", \"alpha\": 0.5}\n",
"\n",
" Returns\n",
" -------\n",
Expand Down
84 changes: 83 additions & 1 deletion nbs/API/plot_tools.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -1081,7 +1081,89 @@
" # Plot the delta text\n",
" for x,y,t,tick in zip(delta_text_x_coordinates, delta_text_y_coordinates,Delta_Values,ticks_to_plot):\n",
" Delta_Text = np.format_float_positional(t, precision=2, sign=True, trim=\"k\", min_digits=2)\n",
" ax_to_plot.text(x, y, Delta_Text, color=delta_text_colors[tick], zorder=5, **delta_text_kwargs)"
" ax_to_plot.text(x, y, Delta_Text, color=delta_text_colors[tick], zorder=5, **delta_text_kwargs)\n",
"\n",
"\n",
"def DeltaDotsPlotter(plot_data, contrast_axes, delta_id_col, idx, xvar, yvar, is_paired, color_col, float_contrast, plot_palette_raw, delta_dot_kwargs):\n",
" \"\"\"\n",
" Parameters\n",
" ----------\n",
" plot_data : object (Dataframe)\n",
" Dataframe of the plot data.\n",
" contrast_axes : object\n",
" Matplotlib axis object to plot on.\n",
" delta_id_col : str\n",
" Column name of the delta id column.\n",
" idx : list\n",
" List of indices of the contrast objects.\n",
" xvar : str\n",
" Column name of the x variable.\n",
" yvar : str\n",
" Column name of the y variable.\n",
" is_paired : bool\n",
" Whether the data is paired.\n",
" color_col : str\n",
" Column name of the color column.\n",
" float_contrast : bool\n",
" Whether the DABEST plot uses Gardner-Altman or Cummings\n",
" plot_palette_raw : list\n",
" List of colors used in the plot.\n",
" delta_dot_kwargs : dict\n",
" Keyword arguments for the delta dots.\n",
" \"\"\"\n",
" \n",
" # Checks and initializations\n",
" from .plot_tools import swarmplot\n",
"\n",
" if color_col is not None:\n",
" plot_palette_deltapts = plot_palette_raw\n",
" delta_plot_data = plot_data[[xvar, yvar, delta_id_col, color_col]]\n",
" else:\n",
" plot_palette_deltapts = \"k\"\n",
" delta_plot_data = plot_data[[xvar, yvar, delta_id_col]]\n",
"\n",
" # TODO: to make jitter value more accurate and not just a hardcoded eyeball value\n",
" jitter = 0.6 if float_contrast else 1 \n",
"\n",
" # Create dataframe of delta values\n",
" final_deltas = pd.DataFrame()\n",
" for i in idx:\n",
" for j in i:\n",
" if i.index(j) != 0:\n",
" temp_df_exp = delta_plot_data[\n",
" delta_plot_data[xvar].str.contains(j)\n",
" ].reset_index(drop=True)\n",
" if is_paired == \"baseline\":\n",
" temp_df_cont = delta_plot_data[\n",
" delta_plot_data[xvar].str.contains(i[0])\n",
" ].reset_index(drop=True)\n",
" elif is_paired == \"sequential\":\n",
" temp_df_cont = delta_plot_data[\n",
" delta_plot_data[xvar].str.contains(\n",
" i[i.index(j) - 1]\n",
" )\n",
" ].reset_index(drop=True)\n",
" delta_df = temp_df_exp.copy()\n",
" delta_df[yvar] = temp_df_exp[yvar] - temp_df_cont[yvar]\n",
" final_deltas = pd.concat([final_deltas, delta_df])\n",
"\n",
" # Plot the delta dots\n",
" swarmplot(\n",
" data=final_deltas,\n",
" x=xvar,\n",
" y=yvar,\n",
" ax=contrast_axes,\n",
" order=None,\n",
" hue=color_col,\n",
" palette=plot_palette_deltapts,\n",
" zorder=2,\n",
" size=3,\n",
" side=\"right\",\n",
" jitter=jitter,\n",
" is_drop_gutter=True,\n",
" gutter_limit=1,\n",
" **delta_dot_kwargs)\n",
" contrast_axes.legend().set_visible(False)"
]
},
{
Expand Down
Loading

0 comments on commit 2982292

Please sign in to comment.