Note
Go to the end to download the full example code.
Violin Plot Examples#
This example demonstrates violin plot functionality in PubliPlots, including simple violin plots, grouped violin plots, split violins, and combined violin+swarm plots.
Examples#
import publiplots as pp
import pandas as pd
import numpy as np
Simple Violin Plot#
Basic violin plot showing distribution by category.
# Create sample data
np.random.seed(42)
n = 200
violin_data = pd.DataFrame({
'category': np.repeat(['A', 'B', 'C', 'D'], n // 4),
'value': np.concatenate([
np.random.normal(10, 2, n // 4),
np.random.normal(15, 3, n // 4),
np.random.normal(12, 2.5, n // 4),
np.random.normal(18, 4, n // 4)
])
})
# Create simple violin plot
ax = pp.violinplot(
data=violin_data,
x='category',
y='value',
title='Simple Violin Plot',
xlabel='Category',
ylabel='Value',
)
pp.show()

Violin Plot with Hue Grouping#
Use the hue parameter to create grouped violin plots.
# Add group variable
violin_data['group'] = np.tile(['Group 1', 'Group 2'], n // 2)
# Create grouped violin plot
ax = pp.violinplot(
data=violin_data,
x='category',
y='value',
hue='group',
gap=0.1,
title='Grouped Violin Plot',
xlabel='Category',
ylabel='Value',
palette={'Group 1': '#8E8EC1', 'Group 2': '#75B375'},
)
pp.show()

Split Violin Plot#
Split violins to compare two groups side by side.
ax = pp.violinplot(
data=violin_data,
x='category',
y='value',
hue='group',
split=True,
inner='quart',
gap=0.1,
title='Split Violin Plot',
xlabel='Category',
ylabel='Value',
)
pp.show()

Horizontal Violin Plot#
Create horizontal violin plots by swapping x and y.
ax = pp.violinplot(
data=violin_data[violin_data['group'] == 'Group 1'],
x='value',
y='category',
title='Horizontal Violin Plot',
xlabel='Value',
ylabel='Category',
)
pp.show()

Univariate (1D) Violin Plot#
Pass only x= or only y= to summarize a single distribution.
A constant categorical axis is synthesized internally so all 2D
features (hue=, side=, inner=, alpha) remain
available. The synthetic axis ticks and spine are hidden so the
result reads cleanly as a single-distribution summary. This is the
form used by pp.JointGrid.plot_marginals() to put violins on
the marginal panels of a joint plot.
fig, axes = pp.subplots(1, 2, axes_size=(40, 50))
pp.violinplot(data=violin_data, y='value', ax=axes[0], title='Vertical (y= only)')
pp.violinplot(data=violin_data, x='value', ax=axes[1], title='Horizontal (x= only)')
pp.show()

Combined Violin and Swarm Plot#
Overlay swarm plot on violin plot to show distribution shape and individual data points.
fig, ax = pp.subplots(axes_size=(80, 65))
# First, create the violin plot
pp.violinplot(
data=violin_data[violin_data['group'] == 'Group 1'],
x='category',
y='value',
ax=ax,
inner=None,
)
# Then overlay the swarm plot
pp.swarmplot(
data=violin_data[violin_data['group'] == 'Group 1'],
x='category',
y='value',
ax=ax,
alpha=1,
legend=False,
size=3,
)
ax.set_title('Combined Violin and Swarm Plot')
ax.set_xlabel('Category')
ax.set_ylabel('Value')
pp.show()

Customization#
Violin Plot with Custom Alpha#
Adjust transparency of violin fill.
ax = pp.violinplot(
data=violin_data,
x='category',
y='value',
hue='group',
gap=0.1,
title='Violin Plot with Custom Alpha',
xlabel='Category',
ylabel='Value',
alpha=0.3,
)
pp.show()

Violin Plot with Different Inner Representations#
Compare different inner representations: box, quart, stick, point.
fig, axes = pp.subplots(2, 2, axes_size=(70, 55))
inner_types = ['box', 'quart', 'stick', 'point']
for ax, inner in zip(axes.flat, inner_types):
pp.violinplot(
data=violin_data[violin_data['group'] == 'Group 1'],
x='category',
y='value',
inner=inner,
ax=ax,
title=f'Inner: {inner}',
xlabel='Category',
ylabel='Value',
)
pp.show()

One-Sided Violin Plots#
Create one-sided (half) violin plots using the side parameter.
fig, axes = pp.subplots(1, 2, axes_size=(70, 60))
# Left-sided violin
pp.violinplot(
data=violin_data,
x='category',
y='value',
hue='group',
side='left',
gap=0.1,
ax=axes[0],
title='Left-Sided Violin Plot',
xlabel='Category',
ylabel='Value',
palette={'Group 1': '#8E8EC1', 'Group 2': '#75B375'},
)
# Right-sided violin
pp.violinplot(
data=violin_data,
x='category',
y='value',
hue='group',
side='right',
gap=0.1,
ax=axes[1],
title='Right-Sided Violin Plot',
xlabel='Category',
ylabel='Value',
palette={'Group 1': '#8E8EC1', 'Group 2': '#75B375'},
)
pp.show()

Annotated violin stats#
Violinplots share the box_stats annotation strategy with boxplots:
annotate=True labels the median by default; pass
stats=[...] to label multiple statistics per violin. See the
dedicated annotations gallery for more.
ax = pp.violinplot(
data=violin_data,
x='category', y='value',
annotate={"stats": ["median", "q1", "q3"], "fmt": ".1f"},
title="annotate={'stats': ['median', 'q1', 'q3']}",
)
pp.show()
![annotate={'stats': ['median', 'q1', 'q3']}](../_images/sphx_glr_plot_15_violin_plots_010.png)
Total running time of the script: (0 minutes 5.773 seconds)