Raincloud Plot Examples

This example demonstrates raincloud plot functionality in PubliPlots, which combines violin plots (clouds), box plots (umbrellas), and strip/swarm plots (rain) to show both distribution shapes and individual data points.

Examples

import publiplots as pp
import pandas as pd
import numpy as np

Simple Raincloud Plot

Basic raincloud plot showing distribution by category.

# Create sample data
np.random.seed(42)
raincloud_data = pd.DataFrame({
    'time': np.repeat(['Day 1', 'Day 3', 'Day 7'], 40),
    'group': np.tile(np.repeat(['Control', 'Treated'], 20), 3),
    'measurement': np.concatenate([
        np.random.normal(50, 8, 20), np.random.normal(52, 8, 20),
        np.random.normal(52, 9, 20), np.random.normal(70, 12, 20),
        np.random.normal(55, 10, 20), np.random.normal(85, 14, 20),
    ])
})


# Create simple raincloud plot
ax = pp.raincloudplot(
    data=raincloud_data,
    x='time',
    y='measurement',
    title='Simple Raincloud Plot',
    xlabel='Time',
    ylabel='Measurement',
    cloud_alpha=0.6,
)
pp.show()
Simple Raincloud Plot

Raincloud Plot with Hue Grouping (Vertical)

Use the hue parameter to create grouped raincloud plots.

# Create grouped raincloud plot
ax = pp.raincloudplot(
    data=raincloud_data,
    x='time',
    y='measurement',
    hue='group',
    title='Grouped Raincloud Plot',
    xlabel='Time',
    ylabel='Measurement',
    cloud_alpha=0.6,
    palette="RdGyBu_r",
    box_offset=0.1,
    rain_offset=0.1,
)
pp.show()
Grouped Raincloud Plot

Horizontal Raincloud Plot with Hue

Create horizontal raincloud plots by swapping x and y.

# Horizontal raincloud needs a tall axes area; compose with pp.subplots
# instead of passing figsize=.
fig, ax = pp.subplots(axes_size=(60, 80))
pp.raincloudplot(
    data=raincloud_data,
    x='measurement',
    y='time',
    hue='group',
    cloud_side="left",
    title='Horizontal Raincloud Plot',
    xlabel='Measurement',
    ylabel='Time',
    cloud_alpha=0.6,
    palette="RdGyBu_r",
    box_offset=0.1,
    rain_offset=0.2,
    rain_kws=dict(
        linewidth=1,
        alpha=0.5,
        jitter=False,
        marker="x"
    ),
    ax=ax,
)
pp.show()
Horizontal Raincloud Plot

Customization

Raincloud Plot Without Box

Create raincloud plot with only cloud and rain elements.

ax = pp.raincloudplot(
    data=raincloud_data[raincloud_data['group'] == 'Control'],
    x='time',
    y='measurement',
    box=False,
    title='Raincloud without Box Plot',
    xlabel='Time',
    ylabel='Measurement',
    cloud_alpha=0.6,
)
pp.show()
Raincloud without Box Plot

Raincloud Plot with Custom Cloud Side

Control which side the cloud appears on.

fig, axes = pp.subplots(1, 2, axes_size=(70, 60))

# Cloud on the left
pp.raincloudplot(
    data=raincloud_data[raincloud_data['group'] == 'Control'],
    x='time',
    y='measurement',
    cloud_side='left',
    ax=axes[0],
    title='Cloud on Left',
    xlabel='Time',
    ylabel='Value',
    cloud_alpha=0.6,
)

# Cloud on the right (default)
pp.raincloudplot(
    data=raincloud_data[raincloud_data['group'] == 'Control'],
    x='time',
    y='measurement',
    cloud_side='right',
    ax=axes[1],
    title='Cloud on Right',
    xlabel='Time',
    ylabel='Measurement',
    cloud_alpha=0.6,
)

pp.show()
Cloud on Left, Cloud on Right

Raincloud Plot with Custom Alpha Values

Adjust transparency of different components.

ax = pp.raincloudplot(
    data=raincloud_data,
    x='time',
    y='measurement',
    hue='group',
    title='Raincloud with Custom Alpha',
    xlabel='Time',
    ylabel='Measurement',
    cloud_alpha=0.3,
    box_kws=dict(alpha=0.5),
    rain_kws=dict(alpha=0.8, linewidth=0),
    palette="RdGyBu_r",
    box_offset=0.1,
    rain_offset=0.1,
)
pp.show()
Raincloud with Custom Alpha

Rounded inner-box via box.border_radius

New in 0.10.6: pp.raincloudplot composes violin + box + strip, and the box component is drawn by pp.boxplot internally. Setting the box.border_radius rcParam rounds the raincloud’s IQR box automatically — no special wiring. The rcParam is restored after the demo so downstream gallery sections see the default flat box.

pp.rcParams["box.border_radius"] = 1.5
try:
    ax = pp.raincloudplot(
        data=raincloud_data,
        x='time',
        y='measurement',
        title='Rounded Box Component',
        xlabel='Time',
        ylabel='Measurement',
        cloud_alpha=0.6,
    )
    pp.show()
finally:
    pp.rcParams["box.border_radius"] = (0.0, 0.0)
Rounded Box Component

Total running time of the script: (0 minutes 4.399 seconds)

Gallery generated by Sphinx-Gallery