Box plots

Matplotlib Basics

2 min read

Published Oct 5 2025


15
0
0
0

ChartsGraphsMatplotlibNumPyPandasPythonVisualisation

A box plot summarises a dataset’s distribution using five key statistics:

  • Minimum (lower whisker)
  • First quartile (Q1) — 25th percentile
  • Median (Q2) — 50th percentile
  • Third quartile (Q3) — 75th percentile
  • Maximum (upper whisker)

It may also show outliers (points beyond the whiskers).


Syntax:

plt.boxplot(x, notch=False, vert=True, patch_artist=False, labels=None,
            widths=None, showmeans=False, meanline=False)

Parameters:

  • x = Data (list, array, or list of lists)
  • notch = Adds notch around median (confidence interval)
  • vert = Vertical (True) or horizontal (False) orientation
  • patch_artist = Fill the boxes with colour
  • labels = Labels for each dataset
  • widths = Width of boxes
  • showmeans = Show the mean value
  • meanline = Draw mean as a line instead of point
  • flierprops, boxprops, medianprops, whiskerprops = Customize element styles



Basic box plot

import matplotlib.pyplot as plt
import numpy as np

data = np.random.randn(100)

plt.boxplot(data)
plt.title("Basic Box Plot")
plt.show()

Shows distribution, median line, quartiles, whiskers, and outliers.


matplotlib box plot chart basic example




Multiple Box Plots

Pass a list of datasets to compare side by side.

import matplotlib.pyplot as plt
import numpy as np

data1 = np.random.normal(0, 1, 100)
data2 = np.random.normal(1, 2, 100)
data3 = np.random.normal(2, 1.5, 100)

plt.boxplot([data1, data2, data3], labels=['A', 'B', 'C'])
plt.title("Multiple Box Plots")
plt.show()

matplotlib box plot chart multiple example




Horizontal orientation

import matplotlib.pyplot as plt
import numpy as np

data1 = np.random.normal(0, 1, 100)
data2 = np.random.normal(1, 2, 100)
data3 = np.random.normal(2, 1.5, 100)

plt.boxplot([data1, data2, data3], vert=False, labels=['A', 'B', 'C'])
plt.title("Horizontal Box Plots")
plt.show()

Great for long category names.


matplotlib box plot chart horizontal example




Notched Box Plots

Notches show a rough confidence interval around the median. If two notches don’t overlap, medians differ significantly.

import matplotlib.pyplot as plt
import numpy as np

data1 = np.random.normal(0, 1, 100)
data2 = np.random.normal(1, 2, 100)
data3 = np.random.normal(2, 1.5, 100)

plt.boxplot([data1, data2, data3], notch=True, labels=['A', 'B', 'C'])
plt.title("Notched Box Plots")
plt.show()

matplotlib box plot chart notched example




Coloured (Filled) Boxes

Use patch_artist=True and set boxprops or facecolor.

import matplotlib.pyplot as plt
import numpy as np

data1 = np.random.normal(0, 1, 100)
data2 = np.random.normal(1, 2, 100)
data3 = np.random.normal(2, 1.5, 100)

colors = ['#99ccff', '#ff9999', '#99ff99']

plt.boxplot(
    [data1, data2, data3],
    patch_artist=True,
    boxprops=dict(facecolor='lightblue', color='blue'),
    medianprops=dict(color='red'),
    labels=['A', 'B', 'C']
)
plt.title("Coloured Box Plots")
plt.show()

matplotlib box plot chart coloured example

Or color each box differently:

import matplotlib.pyplot as plt
import numpy as np

data1 = np.random.normal(0, 1, 100)
data2 = np.random.normal(1, 2, 100)
data3 = np.random.normal(2, 1.5, 100)

colors = ['#99ccff', '#ff9999', '#99ff99']

boxes = plt.boxplot([data1, data2, data3], patch_artist=True)
for patch, color in zip(boxes['boxes'], colors):
    patch.set_facecolor(color)
plt.show()

matplotlib box plot chart individual coloured example




Show mean and mean line

import matplotlib.pyplot as plt
import numpy as np

data1 = np.random.normal(0, 1, 100)
data2 = np.random.normal(1, 2, 100)
data3 = np.random.normal(2, 1.5, 100)

plt.boxplot(
    [data1, data2, data3],
    showmeans=True,
    meanline=True,
    labels=['A', 'B', 'C']
)
plt.title("Box Plot with Mean Line")
plt.show()

matplotlib box plot chart meanline example




Adjust box widths

import matplotlib.pyplot as plt
import numpy as np

data1 = np.random.normal(0, 1, 100)
data2 = np.random.normal(1, 2, 100)
data3 = np.random.normal(2, 1.5, 100)

plt.boxplot([data1, data2, data3], widths=0.5, labels=['A', 'B', 'C'])
plt.title("Custom Box Widths")
plt.show()

matplotlib box plot chart box widths example




Customise outliers

import matplotlib.pyplot as plt
import numpy as np

data1 = np.random.normal(0, 1, 100)
data2 = np.random.normal(1, 2, 100)
data3 = np.random.normal(2, 1.5, 100)

plt.boxplot(
    [data1, data2, data3],
    flierprops=dict(marker='o', markerfacecolor='red', markersize=6, linestyle='none'),
    labels=['A', 'B', 'C']
)
plt.title("Custom Outlier Markers")
plt.show()

matplotlib box plot chart custom outliers example




Display data points on top of box plot

Combine with plt.scatter() or plt.plot() for more detail.

import matplotlib.pyplot as plt
import numpy as np

data = np.random.randn(100)

plt.boxplot(data)
plt.scatter(np.random.normal(1, 0.04, size=len(data)), data, alpha=0.5)
plt.title("Box Plot with Raw Data Overlay")
plt.show()

matplotlib box plot chart data overlayed example




Advanced styling example

import matplotlib.pyplot as plt
import numpy as np

data1 = np.random.normal(0, 1, 100)
data2 = np.random.normal(1, 2, 100)
data3 = np.random.normal(2, 1.5, 100)

plt.boxplot(
    [data1, data2, data3],
    patch_artist=True,
    notch=True,
    showmeans=True,
    meanline=False,
    boxprops=dict(facecolor='lightyellow', color='orange'),
    whiskerprops=dict(color='orange', linewidth=2),
    medianprops=dict(color='red', linewidth=2),
    capprops=dict(color='orange'),
    flierprops=dict(marker='o', color='black', alpha=0.5),
    labels=['A', 'B', 'C']
)
plt.title("Advanced Styled Box Plot")
plt.show()

matplotlib box plot chart advanced styling example
© 2025 SimpleSteps.guide
AboutFAQPoliciesContact