Skip to contents

Creates Raincloud plots to visualize data distributions using ggdist package. Raincloud plots combine three visualization techniques: half-violin plots showing distribution density, box plots showing summary statistics, and dot plots showing individual data points. This provides a comprehensive view of data distribution that reveals patterns traditional box plots might miss, including multimodality and distribution shape. Based on the ggdist R-Bloggers tutorial.

Usage

raincloud(
  data,
  dep_var,
  group_var,
  facet_var = NULL,
  color_var = NULL,
  show_violin = TRUE,
  show_boxplot = TRUE,
  show_dots = TRUE,
  dots_side = "left",
  violin_width = 0.7,
  box_width = 0.2,
  dots_size = 1.2,
  alpha_violin = 0.7,
  alpha_dots = 0.8,
  orientation = "horizontal",
  color_palette = "clinical",
  plot_theme = "clinical",
  plot_title = "Raincloud Plot - Distribution Visualization",
  x_label = "",
  y_label = "",
  show_statistics = TRUE,
  show_outliers = FALSE,
  outlier_method = "iqr",
  normality_test = FALSE,
  comparison_test = FALSE,
  comparison_method = "auto"
)

Arguments

data

The data as a data frame.

dep_var

Continuous variable whose distribution will be visualized in the raincloud plot.

group_var

Categorical variable for grouping. Each group will have its own raincloud visualization.

facet_var

Optional variable for creating separate panels. Creates multiple raincloud plots in a grid layout.

color_var

Optional variable for coloring different elements. If not specified, uses grouping variable.

show_violin

If TRUE, displays half-violin plot showing probability density distribution.

show_boxplot

If TRUE, displays box plot with median, quartiles, and outliers.

show_dots

If TRUE, displays individual data points as dots.

dots_side

Position of data point dots relative to the violin plot.

violin_width

Width scaling factor for the violin plot component.

box_width

Width of the box plot component.

dots_size

Size of individual data point dots.

alpha_violin

Transparency level for violin plot (0 = transparent, 1 = opaque).

alpha_dots

Transparency level for data point dots.

orientation

Orientation of the plot. Horizontal creates the classic "raincloud" appearance.

color_palette

Color palette for different groups including GraphPad Prism palettes.

plot_theme

Overall visual theme for the plot.

plot_title

Custom title for the raincloud plot.

x_label

Custom label for X-axis. If empty, uses variable name.

y_label

Custom label for Y-axis. If empty, uses variable name.

show_statistics

If TRUE, displays summary statistics table for each group.

show_outliers

If TRUE, identifies and highlights outliers in the visualization.

outlier_method

Method for detecting outliers when highlight outliers is enabled.

normality_test

If TRUE, performs normality tests (Shapiro-Wilk) for each group.

comparison_test

If TRUE, performs statistical tests to compare groups.

comparison_method

Statistical test method for comparing groups.

Value

A results object containing:

results$todoa html
results$plotan image
results$statisticsa html
results$outliersa html
results$normalitya html
results$comparisona html
results$interpretationa html

Examples

# Load example dataset
data(histopathology)

# Basic raincloud plot
raincloud(
  data = histopathology,
  dep_var = "Age",
  group_var = "Group"
)
#> 
#>  RAINCLOUD PLOT
#> 
#> character(0)
#> 
#>  <div style='background-color: #f8f9fa; padding: 20px; border-radius:
#>  8px; margin-bottom: 20px;'><h3 style='color: #495057; margin-top:
#>  0;'>📊 Distribution Summary Statistics
#> 
#>  <table style='width: 100%; border-collapse: collapse; font-family:
#>  Arial, sans-serif;'><tr style='background-color: #6c757d; color:
#>  white;'><th style='padding: 8px; border: 1px solid #dee2e6;'>Group<th
#>  style='padding: 8px; border: 1px solid #dee2e6;'>N<th style='padding:
#>  8px; border: 1px solid #dee2e6;'>Mean<th style='padding: 8px; border:
#>  1px solid #dee2e6;'>Median<th style='padding: 8px; border: 1px solid
#>  #dee2e6;'>SD<th style='padding: 8px; border: 1px solid
#>  #dee2e6;'>IQR<th style='padding: 8px; border: 1px solid
#>  #dee2e6;'>Range<th style='padding: 8px; border: 1px solid
#>  #dee2e6;'>Skewness<tr style='background-color: #f8f9fa;'><td
#>  style='padding: 8px; border: 1px solid #dee2e6;'>Control<td
#>  style='padding: 8px; border: 1px solid #dee2e6; text-align:
#>  center;'>120<td style='padding: 8px; border: 1px solid #dee2e6;
#>  text-align: center;'>49.825<td style='padding: 8px; border: 1px solid
#>  #dee2e6; text-align: center;'>49.5<td style='padding: 8px; border: 1px
#>  solid #dee2e6; text-align: center;'>14.415<td style='padding: 8px;
#>  border: 1px solid #dee2e6; text-align: center;'>26.5<td
#>  style='padding: 8px; border: 1px solid #dee2e6; text-align:
#>  center;'>26 - 73<td style='padding: 8px; border: 1px solid #dee2e6;
#>  text-align: center;'>-0.017<tr style='background-color: #ffffff;'><td
#>  style='padding: 8px; border: 1px solid #dee2e6;'>Treatment<td
#>  style='padding: 8px; border: 1px solid #dee2e6; text-align:
#>  center;'>128<td style='padding: 8px; border: 1px solid #dee2e6;
#>  text-align: center;'>48.969<td style='padding: 8px; border: 1px solid
#>  #dee2e6; text-align: center;'>49<td style='padding: 8px; border: 1px
#>  solid #dee2e6; text-align: center;'>13.256<td style='padding: 8px;
#>  border: 1px solid #dee2e6; text-align: center;'>21.25<td
#>  style='padding: 8px; border: 1px solid #dee2e6; text-align:
#>  center;'>25 - 73<td style='padding: 8px; border: 1px solid #dee2e6;
#>  text-align: center;'>-0.046<p style='font-size: 12px; color: #6c757d;
#>  margin-top: 15px;'>*IQR = Interquartile Range, SD = Standard
#>  Deviation. Skewness: 0 = symmetric, >0 = right-skewed, <0 =
#>  left-skewed.*
#> 
#>  <div style='background-color: #e8f5e8; padding: 20px; border-radius:
#>  8px;'><h3 style='color: #2e7d32; margin-top: 0;'>📋 Raincloud Plot
#>  Interpretation Guide
#> 
#>  <h4 style='color: #2e7d32;'>Plot Summary:
#> 
#>  Variable: Age (distribution analysis)Groups: 2 groups defined by
#>  GroupObservations: 248 data pointsVisualization: Half-violin (density)
#>  + Box plot (quartiles) + Data points (individual values)<h4
#>  style='color: #2e7d32;'>How to Read Raincloud Plots:
#> 
#>  Half-Violin: Shows probability density - wider areas indicate more
#>  data pointsBox Plot: Shows median (line), quartiles (box), and
#>  outliers (points)Data Points: Individual observations reveal
#>  fine-grained patternsShape Patterns: Symmetric, skewed, bimodal, or
#>  multimodal distributions<h4 style='color: #2e7d32;'>Distribution
#>  Patterns to Look For:
#> 
#>  Symmetry: Bell-shaped density indicates normal distributionSkewness:
#>  Tail extending to one side (left-skewed or right-skewed)Multimodality:
#>  Multiple peaks suggest subgroups within dataOutliers: Points far from
#>  the main distributionSpread: Width of distribution indicates
#>  variability<h4 style='color: #2e7d32;'>Clinical/Research Applications:
#> 
#>  Biomarker Analysis: Compare distributions across patient
#>  groupsTreatment Effects: Visualize before/after treatment
#>  distributionsQuality Control: Identify unusual patterns in laboratory
#>  valuesSubgroup Discovery: Detect hidden subpopulations in data<p
#>  style='font-size: 12px; color: #2e7d32; margin-top: 15px;'>*💡
#>  Raincloud plots reveal distribution nuances that traditional box plots
#>  miss, making them ideal for exploratory data analysis and
#>  publication-quality visualizations.*


# Advanced raincloud plot with faceting and custom colors
raincloud(
  data = histopathology,
  dep_var = "OverallTime",
  group_var = "Group",
  facet_var = "Sex",
  color_var = "Race",
  color_palette = "clinical",
  plot_theme = "publication"
)
#> 
#>  RAINCLOUD PLOT
#> 
#> character(0)
#> 
#>  <div style='background-color: #f8f9fa; padding: 20px; border-radius:
#>  8px; margin-bottom: 20px;'><h3 style='color: #495057; margin-top:
#>  0;'>📊 Distribution Summary Statistics
#> 
#>  <table style='width: 100%; border-collapse: collapse; font-family:
#>  Arial, sans-serif;'><tr style='background-color: #6c757d; color:
#>  white;'><th style='padding: 8px; border: 1px solid #dee2e6;'>Group<th
#>  style='padding: 8px; border: 1px solid #dee2e6;'>N<th style='padding:
#>  8px; border: 1px solid #dee2e6;'>Mean<th style='padding: 8px; border:
#>  1px solid #dee2e6;'>Median<th style='padding: 8px; border: 1px solid
#>  #dee2e6;'>SD<th style='padding: 8px; border: 1px solid
#>  #dee2e6;'>IQR<th style='padding: 8px; border: 1px solid
#>  #dee2e6;'>Range<th style='padding: 8px; border: 1px solid
#>  #dee2e6;'>Skewness<tr style='background-color: #f8f9fa;'><td
#>  style='padding: 8px; border: 1px solid #dee2e6;'>Control<td
#>  style='padding: 8px; border: 1px solid #dee2e6; text-align:
#>  center;'>119<td style='padding: 8px; border: 1px solid #dee2e6;
#>  text-align: center;'>16.243<td style='padding: 8px; border: 1px solid
#>  #dee2e6; text-align: center;'>9.7<td style='padding: 8px; border: 1px
#>  solid #dee2e6; text-align: center;'>13.666<td style='padding: 8px;
#>  border: 1px solid #dee2e6; text-align: center;'>15.85<td
#>  style='padding: 8px; border: 1px solid #dee2e6; text-align:
#>  center;'>2.9 - 57.7<td style='padding: 8px; border: 1px solid #dee2e6;
#>  text-align: center;'>1.448<tr style='background-color: #ffffff;'><td
#>  style='padding: 8px; border: 1px solid #dee2e6;'>Treatment<td
#>  style='padding: 8px; border: 1px solid #dee2e6; text-align:
#>  center;'>126<td style='padding: 8px; border: 1px solid #dee2e6;
#>  text-align: center;'>16.933<td style='padding: 8px; border: 1px solid
#>  #dee2e6; text-align: center;'>10.7<td style='padding: 8px; border: 1px
#>  solid #dee2e6; text-align: center;'>13.524<td style='padding: 8px;
#>  border: 1px solid #dee2e6; text-align: center;'>17.775<td
#>  style='padding: 8px; border: 1px solid #dee2e6; text-align:
#>  center;'>3.1 - 58.2<td style='padding: 8px; border: 1px solid #dee2e6;
#>  text-align: center;'>1.227<p style='font-size: 12px; color: #6c757d;
#>  margin-top: 15px;'>*IQR = Interquartile Range, SD = Standard
#>  Deviation. Skewness: 0 = symmetric, >0 = right-skewed, <0 =
#>  left-skewed.*
#> 
#>  <div style='background-color: #e8f5e8; padding: 20px; border-radius:
#>  8px;'><h3 style='color: #2e7d32; margin-top: 0;'>📋 Raincloud Plot
#>  Interpretation Guide
#> 
#>  <h4 style='color: #2e7d32;'>Plot Summary:
#> 
#>  Variable: OverallTime (distribution analysis)Groups: 2 groups defined
#>  by GroupObservations: 245 data pointsVisualization: Half-violin
#>  (density) + Box plot (quartiles) + Data points (individual values)<h4
#>  style='color: #2e7d32;'>How to Read Raincloud Plots:
#> 
#>  Half-Violin: Shows probability density - wider areas indicate more
#>  data pointsBox Plot: Shows median (line), quartiles (box), and
#>  outliers (points)Data Points: Individual observations reveal
#>  fine-grained patternsShape Patterns: Symmetric, skewed, bimodal, or
#>  multimodal distributions<h4 style='color: #2e7d32;'>Distribution
#>  Patterns to Look For:
#> 
#>  Symmetry: Bell-shaped density indicates normal distributionSkewness:
#>  Tail extending to one side (left-skewed or right-skewed)Multimodality:
#>  Multiple peaks suggest subgroups within dataOutliers: Points far from
#>  the main distributionSpread: Width of distribution indicates
#>  variability<h4 style='color: #2e7d32;'>Clinical/Research Applications:
#> 
#>  Biomarker Analysis: Compare distributions across patient
#>  groupsTreatment Effects: Visualize before/after treatment
#>  distributionsQuality Control: Identify unusual patterns in laboratory
#>  valuesSubgroup Discovery: Detect hidden subpopulations in data<p
#>  style='font-size: 12px; color: #2e7d32; margin-top: 15px;'>*💡
#>  Raincloud plots reveal distribution nuances that traditional box plots
#>  miss, making them ideal for exploratory data analysis and
#>  publication-quality visualizations.*


# Statistical analysis with outlier detection
raincloud(
  data = histopathology,
  dep_var = "Age",
  group_var = "Group",
  show_statistics = TRUE,
  show_outliers = TRUE,
  outlier_method = "iqr",
  normality_test = TRUE,
  comparison_test = TRUE
)
#> 
#>  RAINCLOUD PLOT
#> 
#> character(0)
#> 
#>  <div style='background-color: #f8f9fa; padding: 20px; border-radius:
#>  8px; margin-bottom: 20px;'><h3 style='color: #495057; margin-top:
#>  0;'>📊 Distribution Summary Statistics
#> 
#>  <table style='width: 100%; border-collapse: collapse; font-family:
#>  Arial, sans-serif;'><tr style='background-color: #6c757d; color:
#>  white;'><th style='padding: 8px; border: 1px solid #dee2e6;'>Group<th
#>  style='padding: 8px; border: 1px solid #dee2e6;'>N<th style='padding:
#>  8px; border: 1px solid #dee2e6;'>Mean<th style='padding: 8px; border:
#>  1px solid #dee2e6;'>Median<th style='padding: 8px; border: 1px solid
#>  #dee2e6;'>SD<th style='padding: 8px; border: 1px solid
#>  #dee2e6;'>IQR<th style='padding: 8px; border: 1px solid
#>  #dee2e6;'>Range<th style='padding: 8px; border: 1px solid
#>  #dee2e6;'>Skewness<tr style='background-color: #f8f9fa;'><td
#>  style='padding: 8px; border: 1px solid #dee2e6;'>Control<td
#>  style='padding: 8px; border: 1px solid #dee2e6; text-align:
#>  center;'>120<td style='padding: 8px; border: 1px solid #dee2e6;
#>  text-align: center;'>49.825<td style='padding: 8px; border: 1px solid
#>  #dee2e6; text-align: center;'>49.5<td style='padding: 8px; border: 1px
#>  solid #dee2e6; text-align: center;'>14.415<td style='padding: 8px;
#>  border: 1px solid #dee2e6; text-align: center;'>26.5<td
#>  style='padding: 8px; border: 1px solid #dee2e6; text-align:
#>  center;'>26 - 73<td style='padding: 8px; border: 1px solid #dee2e6;
#>  text-align: center;'>-0.017<tr style='background-color: #ffffff;'><td
#>  style='padding: 8px; border: 1px solid #dee2e6;'>Treatment<td
#>  style='padding: 8px; border: 1px solid #dee2e6; text-align:
#>  center;'>128<td style='padding: 8px; border: 1px solid #dee2e6;
#>  text-align: center;'>48.969<td style='padding: 8px; border: 1px solid
#>  #dee2e6; text-align: center;'>49<td style='padding: 8px; border: 1px
#>  solid #dee2e6; text-align: center;'>13.256<td style='padding: 8px;
#>  border: 1px solid #dee2e6; text-align: center;'>21.25<td
#>  style='padding: 8px; border: 1px solid #dee2e6; text-align:
#>  center;'>25 - 73<td style='padding: 8px; border: 1px solid #dee2e6;
#>  text-align: center;'>-0.046<p style='font-size: 12px; color: #6c757d;
#>  margin-top: 15px;'>*IQR = Interquartile Range, SD = Standard
#>  Deviation. Skewness: 0 = symmetric, >0 = right-skewed, <0 =
#>  left-skewed.*
#> 
#>  <div style='background-color: #fff3cd; padding: 20px; border-radius:
#>  8px; margin-bottom: 20px;'><h3 style='color: #856404; margin-top:
#>  0;'>⚠️ Outlier Detection (Iqr Method)
#> 
#>  Control: 0 outliers detectedTreatment: 0 outliers detected
#> 
#>  Total outliers across all groups: 0
#> 
#>  <p style='font-size: 12px; color: #856404; margin-top: 15px;'>*IQR
#>  Method: Values beyond 1.5 × IQR from Q1/Q3. Consider investigating
#>  these points for data quality or interesting patterns.*
#> 
#>  <div style='background-color: #d1ecf1; padding: 20px; border-radius:
#>  8px; margin-bottom: 20px;'><h3 style='color: #0c5460; margin-top:
#>  0;'>📈 Normality Tests (Shapiro-Wilk)
#> 
#>  <table style='width: 100%; border-collapse: collapse;'><tr
#>  style='background-color: #e0e0e0;'><th style='padding: 8px; border:
#>  1px solid #ddd;'>Group<th style='padding: 8px; border: 1px solid
#>  #ddd;'>W Statistic<th style='padding: 8px; border: 1px solid
#>  #ddd;'>P-value<th style='padding: 8px; border: 1px solid
#>  #ddd;'>Interpretation<td style='padding: 8px; border: 1px solid
#>  #ddd;'>Control<td style='padding: 8px; border: 1px solid #ddd;
#>  text-align: center;'>0.9432<td style='padding: 8px; border: 1px solid
#>  #ddd; text-align: center;'>1e-04<td style='padding: 8px; border: 1px
#>  solid #ddd; text-align: center;'>Non-normal<td style='padding: 8px;
#>  border: 1px solid #ddd;'>Treatment<td style='padding: 8px; border: 1px
#>  solid #ddd; text-align: center;'>0.9594<td style='padding: 8px;
#>  border: 1px solid #ddd; text-align: center;'>7e-04<td style='padding:
#>  8px; border: 1px solid #ddd; text-align: center;'>Non-normal<p
#>  style='font-size: 12px; color: #0c5460; margin-top:
#>  15px;'>*Shapiro-Wilk test: p > 0.05 suggests normal distribution.
#>  Valid for sample sizes 3-5000.*
#> 
#>  <div style='background-color: #f3e5f5; padding: 20px; border-radius:
#>  8px; margin-bottom: 20px;'><h3 style='color: #7b1fa2; margin-top:
#>  0;'>📊 Group Comparison Test
#> 
#>  <table style='width: 100%; border-collapse: collapse;'><td
#>  style='padding: 8px; border: 1px solid #ddd;'>Test Method:<td
#>  style='padding: 8px; border: 1px solid #ddd;'>Wilcoxon<td
#>  style='padding: 8px; border: 1px solid #ddd;'>Test Statistic:<td
#>  style='padding: 8px; border: 1px solid #ddd;'>W = 7955.5<td
#>  style='padding: 8px; border: 1px solid #ddd;'>P-value:<td
#>  style='padding: 8px; border: 1px solid #ddd;'>0.6261<td
#>  style='padding: 8px; border: 1px solid #ddd;'>Result:<td
#>  style='padding: 8px; border: 1px solid #ddd;'>Not significant<p
#>  style='font-size: 12px; color: #7b1fa2; margin-top: 15px;'>** p <
#>  0.05, ** p < 0.01, *** p < 0.001. Automatically selected {test_method}
#>  based on data characteristics.*
#> 
#>  <div style='background-color: #e3f2fd; padding: 15px; border-radius:
#>  5px; margin: 10px 0;'><h4 style='margin-top: 0; color: #1976d2;'>📝
#>  Copy-Ready Result
#> 
#>  <p style='font-family: monospace; background: white; padding: 10px;
#>  border: 1px solid #ddd; border-radius: 3px;'>The Wilcoxon test
#>  comparing Control vs Treatment showed not significant differences (p =
#>  0.626). No significant differences detected between groups.
#> 
#>  <small style='color: #666;'>💡 This sentence is ready to copy into
#>  your research report
#> 
#>  <div style='background-color: #e8f5e8; padding: 20px; border-radius:
#>  8px;'><h3 style='color: #2e7d32; margin-top: 0;'>📋 Raincloud Plot
#>  Interpretation Guide
#> 
#>  <h4 style='color: #2e7d32;'>Plot Summary:
#> 
#>  Variable: Age (distribution analysis)Groups: 2 groups defined by
#>  GroupObservations: 248 data pointsVisualization: Half-violin (density)
#>  + Box plot (quartiles) + Data points (individual values)<h4
#>  style='color: #2e7d32;'>How to Read Raincloud Plots:
#> 
#>  Half-Violin: Shows probability density - wider areas indicate more
#>  data pointsBox Plot: Shows median (line), quartiles (box), and
#>  outliers (points)Data Points: Individual observations reveal
#>  fine-grained patternsShape Patterns: Symmetric, skewed, bimodal, or
#>  multimodal distributions<h4 style='color: #2e7d32;'>Distribution
#>  Patterns to Look For:
#> 
#>  Symmetry: Bell-shaped density indicates normal distributionSkewness:
#>  Tail extending to one side (left-skewed or right-skewed)Multimodality:
#>  Multiple peaks suggest subgroups within dataOutliers: Points far from
#>  the main distributionSpread: Width of distribution indicates
#>  variability<h4 style='color: #2e7d32;'>Clinical/Research Applications:
#> 
#>  Biomarker Analysis: Compare distributions across patient
#>  groupsTreatment Effects: Visualize before/after treatment
#>  distributionsQuality Control: Identify unusual patterns in laboratory
#>  valuesSubgroup Discovery: Detect hidden subpopulations in data<p
#>  style='font-size: 12px; color: #2e7d32; margin-top: 15px;'>*💡
#>  Raincloud plots reveal distribution nuances that traditional box plots
#>  miss, making them ideal for exploratory data analysis and
#>  publication-quality visualizations.*


# Customized visualization components
raincloud(
  data = histopathology,
  dep_var = "Age",
  group_var = "Group",
  show_violin = TRUE,
  show_boxplot = TRUE,
  show_dots = TRUE,
  dots_side = "left",
  orientation = "horizontal",
  violin_width = 0.8,
  alpha_violin = 0.6
)
#> 
#>  RAINCLOUD PLOT
#> 
#> character(0)
#> 
#>  <div style='background-color: #f8f9fa; padding: 20px; border-radius:
#>  8px; margin-bottom: 20px;'><h3 style='color: #495057; margin-top:
#>  0;'>📊 Distribution Summary Statistics
#> 
#>  <table style='width: 100%; border-collapse: collapse; font-family:
#>  Arial, sans-serif;'><tr style='background-color: #6c757d; color:
#>  white;'><th style='padding: 8px; border: 1px solid #dee2e6;'>Group<th
#>  style='padding: 8px; border: 1px solid #dee2e6;'>N<th style='padding:
#>  8px; border: 1px solid #dee2e6;'>Mean<th style='padding: 8px; border:
#>  1px solid #dee2e6;'>Median<th style='padding: 8px; border: 1px solid
#>  #dee2e6;'>SD<th style='padding: 8px; border: 1px solid
#>  #dee2e6;'>IQR<th style='padding: 8px; border: 1px solid
#>  #dee2e6;'>Range<th style='padding: 8px; border: 1px solid
#>  #dee2e6;'>Skewness<tr style='background-color: #f8f9fa;'><td
#>  style='padding: 8px; border: 1px solid #dee2e6;'>Control<td
#>  style='padding: 8px; border: 1px solid #dee2e6; text-align:
#>  center;'>120<td style='padding: 8px; border: 1px solid #dee2e6;
#>  text-align: center;'>49.825<td style='padding: 8px; border: 1px solid
#>  #dee2e6; text-align: center;'>49.5<td style='padding: 8px; border: 1px
#>  solid #dee2e6; text-align: center;'>14.415<td style='padding: 8px;
#>  border: 1px solid #dee2e6; text-align: center;'>26.5<td
#>  style='padding: 8px; border: 1px solid #dee2e6; text-align:
#>  center;'>26 - 73<td style='padding: 8px; border: 1px solid #dee2e6;
#>  text-align: center;'>-0.017<tr style='background-color: #ffffff;'><td
#>  style='padding: 8px; border: 1px solid #dee2e6;'>Treatment<td
#>  style='padding: 8px; border: 1px solid #dee2e6; text-align:
#>  center;'>128<td style='padding: 8px; border: 1px solid #dee2e6;
#>  text-align: center;'>48.969<td style='padding: 8px; border: 1px solid
#>  #dee2e6; text-align: center;'>49<td style='padding: 8px; border: 1px
#>  solid #dee2e6; text-align: center;'>13.256<td style='padding: 8px;
#>  border: 1px solid #dee2e6; text-align: center;'>21.25<td
#>  style='padding: 8px; border: 1px solid #dee2e6; text-align:
#>  center;'>25 - 73<td style='padding: 8px; border: 1px solid #dee2e6;
#>  text-align: center;'>-0.046<p style='font-size: 12px; color: #6c757d;
#>  margin-top: 15px;'>*IQR = Interquartile Range, SD = Standard
#>  Deviation. Skewness: 0 = symmetric, >0 = right-skewed, <0 =
#>  left-skewed.*
#> 
#>  <div style='background-color: #e8f5e8; padding: 20px; border-radius:
#>  8px;'><h3 style='color: #2e7d32; margin-top: 0;'>📋 Raincloud Plot
#>  Interpretation Guide
#> 
#>  <h4 style='color: #2e7d32;'>Plot Summary:
#> 
#>  Variable: Age (distribution analysis)Groups: 2 groups defined by
#>  GroupObservations: 248 data pointsVisualization: Half-violin (density)
#>  + Box plot (quartiles) + Data points (individual values)<h4
#>  style='color: #2e7d32;'>How to Read Raincloud Plots:
#> 
#>  Half-Violin: Shows probability density - wider areas indicate more
#>  data pointsBox Plot: Shows median (line), quartiles (box), and
#>  outliers (points)Data Points: Individual observations reveal
#>  fine-grained patternsShape Patterns: Symmetric, skewed, bimodal, or
#>  multimodal distributions<h4 style='color: #2e7d32;'>Distribution
#>  Patterns to Look For:
#> 
#>  Symmetry: Bell-shaped density indicates normal distributionSkewness:
#>  Tail extending to one side (left-skewed or right-skewed)Multimodality:
#>  Multiple peaks suggest subgroups within dataOutliers: Points far from
#>  the main distributionSpread: Width of distribution indicates
#>  variability<h4 style='color: #2e7d32;'>Clinical/Research Applications:
#> 
#>  Biomarker Analysis: Compare distributions across patient
#>  groupsTreatment Effects: Visualize before/after treatment
#>  distributionsQuality Control: Identify unusual patterns in laboratory
#>  valuesSubgroup Discovery: Detect hidden subpopulations in data<p
#>  style='font-size: 12px; color: #2e7d32; margin-top: 15px;'>*💡
#>  Raincloud plots reveal distribution nuances that traditional box plots
#>  miss, making them ideal for exploratory data analysis and
#>  publication-quality visualizations.*