Skip to content

Commit 75929f3

Browse files
committed
Contrast bars added to forest plot
1 parent 996643f commit 75929f3

27 files changed

+167
-36
lines changed

dabest/forest_plot.py

+37-3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import seaborn as sns
1212
from typing import List, Optional, Union
1313
import numpy as np
14+
import matplotlib.axes as axes
15+
import matplotlib.patches as mpatches
1416

1517
# %% ../nbs/API/forest_plot.ipynb 6
1618
def load_plot_data(
@@ -266,6 +268,7 @@ def get_kwargs(
266268
marker_kwargs,
267269
errorbar_kwargs,
268270
delta_text_kwargs,
271+
contrast_bars_kwargs,
269272
marker_size
270273
):
271274
from .misc_tools import merge_two_dicts
@@ -336,7 +339,21 @@ def get_kwargs(
336339
else:
337340
delta_text_kwargs = merge_two_dicts(default_delta_text_kwargs, delta_text_kwargs)
338341

339-
return violin_kwargs, zeroline_kwargs, marker_kwargs, errorbar_kwargs, delta_text_kwargs
342+
# Contrast bars kwargs.
343+
default_contrast_bars_kwargs = {
344+
"color": None,
345+
"zorder":-3,
346+
'alpha': 0.15
347+
}
348+
if contrast_bars_kwargs is None:
349+
contrast_bars_kwargs = default_contrast_bars_kwargs
350+
else:
351+
contrast_bars_kwargs = merge_two_dicts(default_contrast_bars_kwargs, contrast_bars_kwargs)
352+
353+
354+
return (violin_kwargs, zeroline_kwargs, marker_kwargs, errorbar_kwargs,
355+
delta_text_kwargs, contrast_bars_kwargs)
356+
340357

341358

342359
def color_palette(
@@ -393,6 +410,9 @@ def forest_plot(
393410
delta_text: bool = True,
394411
delta_text_kwargs: dict = None,
395412

413+
contrast_bars: bool = True,
414+
contrast_bars_kwargs: dict = None,
415+
396416
violin_kwargs: Optional[dict] = None,
397417
zeroline_kwargs: Optional[dict] = None,
398418
marker_kwargs: Optional[dict] = None,
@@ -512,14 +532,15 @@ def forest_plot(
512532
fig, ax = plt.subplots(figsize=fig_size)
513533

514534
# Get Kwargs
515-
(violin_kwargs, zeroline_kwargs,
516-
marker_kwargs, errorbar_kwargs, delta_text_kwargs) = get_kwargs(
535+
(violin_kwargs, zeroline_kwargs, marker_kwargs,
536+
errorbar_kwargs, delta_text_kwargs, contrast_bars_kwargs) = get_kwargs(
517537
violin_kwargs = violin_kwargs,
518538
zeroline_kwargs = zeroline_kwargs,
519539
horizontal = horizontal,
520540
marker_kwargs = marker_kwargs,
521541
errorbar_kwargs = errorbar_kwargs,
522542
delta_text_kwargs = delta_text_kwargs,
543+
contrast_bars_kwargs = contrast_bars_kwargs,
523544
marker_size = marker_size
524545
)
525546

@@ -661,6 +682,19 @@ def forest_plot(
661682
delta_text = np.format_float_positional(delta, precision=2, sign=True, trim="k", min_digits=2)
662683
ax.text(x, y, delta_text, color=delta_text_colors[idx], zorder=5, **delta_text_kwargs)
663684

685+
# Contrast bars
686+
if contrast_bars:
687+
_bar_color = contrast_bars_kwargs.pop('color')
688+
if _bar_color is not None:
689+
bar_colors = [_bar_color] * number_of_curves_to_plot
690+
else:
691+
bar_colors = violin_colors
692+
for x, y in zip(np.arange(1, number_of_curves_to_plot + 1), differences):
693+
if horizontal:
694+
ax.add_patch(mpatches.Rectangle((0, x-0.25), y, 0.25, color=bar_colors[x-1], **contrast_bars_kwargs))
695+
else:
696+
ax.add_patch(mpatches.Rectangle((x, 0), 0.25, y, color=bar_colors[x-1], **contrast_bars_kwargs))
697+
664698
## Invert Y-axis if horizontal
665699
if horizontal:
666700
ax.invert_yaxis()

nbs/API/forest_plot.ipynb

+38-4
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,9 @@
6363
"# %matplotlib inline\n",
6464
"import seaborn as sns\n",
6565
"from typing import List, Optional, Union\n",
66-
"import numpy as np"
66+
"import numpy as np\n",
67+
"import matplotlib.axes as axes\n",
68+
"import matplotlib.patches as mpatches"
6769
]
6870
},
6971
{
@@ -326,6 +328,7 @@
326328
" marker_kwargs,\n",
327329
" errorbar_kwargs,\n",
328330
" delta_text_kwargs,\n",
331+
" contrast_bars_kwargs,\n",
329332
" marker_size\n",
330333
" ):\n",
331334
" from .misc_tools import merge_two_dicts\n",
@@ -396,7 +399,21 @@
396399
" else:\n",
397400
" delta_text_kwargs = merge_two_dicts(default_delta_text_kwargs, delta_text_kwargs)\n",
398401
"\n",
399-
" return violin_kwargs, zeroline_kwargs, marker_kwargs, errorbar_kwargs, delta_text_kwargs\n",
402+
" # Contrast bars kwargs.\n",
403+
" default_contrast_bars_kwargs = {\n",
404+
" \"color\": None, \n",
405+
" \"zorder\":-3,\n",
406+
" 'alpha': 0.15\n",
407+
" }\n",
408+
" if contrast_bars_kwargs is None:\n",
409+
" contrast_bars_kwargs = default_contrast_bars_kwargs\n",
410+
" else:\n",
411+
" contrast_bars_kwargs = merge_two_dicts(default_contrast_bars_kwargs, contrast_bars_kwargs)\n",
412+
"\n",
413+
"\n",
414+
" return (violin_kwargs, zeroline_kwargs, marker_kwargs, errorbar_kwargs, \n",
415+
" delta_text_kwargs, contrast_bars_kwargs)\n",
416+
"\n",
400417
"\n",
401418
"\n",
402419
"def color_palette(\n",
@@ -453,6 +470,9 @@
453470
" delta_text: bool = True,\n",
454471
" delta_text_kwargs: dict = None,\n",
455472
"\n",
473+
" contrast_bars: bool = True,\n",
474+
" contrast_bars_kwargs: dict = None,\n",
475+
"\n",
456476
" violin_kwargs: Optional[dict] = None,\n",
457477
" zeroline_kwargs: Optional[dict] = None,\n",
458478
" marker_kwargs: Optional[dict] = None,\n",
@@ -572,14 +592,15 @@
572592
" fig, ax = plt.subplots(figsize=fig_size)\n",
573593
"\n",
574594
" # Get Kwargs\n",
575-
" (violin_kwargs, zeroline_kwargs, \n",
576-
" marker_kwargs, errorbar_kwargs, delta_text_kwargs) = get_kwargs(\n",
595+
" (violin_kwargs, zeroline_kwargs, marker_kwargs, \n",
596+
" errorbar_kwargs, delta_text_kwargs, contrast_bars_kwargs) = get_kwargs(\n",
577597
" violin_kwargs = violin_kwargs,\n",
578598
" zeroline_kwargs = zeroline_kwargs,\n",
579599
" horizontal = horizontal,\n",
580600
" marker_kwargs = marker_kwargs,\n",
581601
" errorbar_kwargs = errorbar_kwargs,\n",
582602
" delta_text_kwargs = delta_text_kwargs,\n",
603+
" contrast_bars_kwargs = contrast_bars_kwargs,\n",
583604
" marker_size = marker_size\n",
584605
" )\n",
585606
" \n",
@@ -721,6 +742,19 @@
721742
" delta_text = np.format_float_positional(delta, precision=2, sign=True, trim=\"k\", min_digits=2)\n",
722743
" ax.text(x, y, delta_text, color=delta_text_colors[idx], zorder=5, **delta_text_kwargs)\n",
723744
"\n",
745+
" # Contrast bars\n",
746+
" if contrast_bars:\n",
747+
" _bar_color = contrast_bars_kwargs.pop('color')\n",
748+
" if _bar_color is not None:\n",
749+
" bar_colors = [_bar_color] * number_of_curves_to_plot\n",
750+
" else:\n",
751+
" bar_colors = violin_colors\n",
752+
" for x, y in zip(np.arange(1, number_of_curves_to_plot + 1), differences):\n",
753+
" if horizontal:\n",
754+
" ax.add_patch(mpatches.Rectangle((0, x-0.25), y, 0.25, color=bar_colors[x-1], **contrast_bars_kwargs))\n",
755+
" else:\n",
756+
" ax.add_patch(mpatches.Rectangle((x, 0), 0.25, y, color=bar_colors[x-1], **contrast_bars_kwargs))\n",
757+
"\n",
724758
" ## Invert Y-axis if horizontal \n",
725759
" if horizontal:\n",
726760
" ax.invert_yaxis()\n",
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading

nbs/tests/mpl_image_tests/test_05_forest_plot.py

+10
Original file line numberDiff line numberDiff line change
@@ -401,4 +401,14 @@ def test_520_minimeta_with_deltas_and_delta_text_kwargs_forest():
401401
delta_text_kwargs={'color': 'black','fontsize': 8, 'rotation': 45, 'va': 'bottom',
402402
'x_coordinates': [1.4, 2.4, 3.4, 4.4, 5.4, 6.4],
403403
'y_coordinates': [0.6, 0.1, -2, -1.5, -1.5, -1.5]}
404+
)
405+
406+
@pytest.mark.mpl_image_compare(tolerance=8)
407+
def test_521_minimeta_with_deltas_with_contrast_bars_kwargs_forest():
408+
plt.rcdefaults()
409+
return forest_plot(
410+
contrasts_mini_meta,
411+
idx=[(0, 3),(0, 3),(0, 3)],
412+
labels=['Contrast A1', 'Mini_Meta A', 'Contrast B1', 'Mini_Meta B', 'Contrast C1', 'Mini_Meta C'],
413+
contrast_bars_kwargs={'color': 'red', 'alpha': 0.4}
404414
)

nbs/tutorials/07-forest_plot.ipynb

+82-29
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)