pythonmatplotlibboxplotquartile

How to label quartiles in matplotlib boxplots?


I have a list of values which I want to plot the distribution for. I'm using a box-plot but it would be nice to add some dotted lines going from the boxplot quartiles to the axis. Also I want just the quartile values displayed on the x ticks. Here's a rough idea but with values at the end instead of names.

import numpy as np
import pandas as pd 
import matplotlib.pylab as plt


vel_arr = np.random.rand(1000,1)
fig = plt.figure(1, figsize=(9, 6))
ax = fig.add_subplot(111)

# Create the boxplot
ax.boxplot(vel_arr,vert=False, manage_ticks=True)
ax.set_xlabel('value')
plt.yticks([1], ['category'])
plt.show()

Solution

  • np.quantile calculates the desired quantiles.

    ax.vlines draws vertical lines, for example from the center of the boxplot to y=0. zorder=0 makes sure these lines go behind the boxplot.

    ax.set_ylim(0.5, 1.5) resets the ylims. Default, the vlines force the ylims with some extra padding.

    ax.set_xticks(quantiles) sets xticks at the position of every quantile.

    import numpy as np
    import matplotlib.pylab as plt
    
    vel_arr = np.random.rand(50, 1)
    fig = plt.figure(1, figsize=(9, 6))
    ax = fig.add_subplot(111)
    
    ax.boxplot(vel_arr, vert=False, manage_ticks=True)
    ax.set_xlabel('value')
    ax.set_yticks([1])
    ax.set_yticklabels(['category'])
    
    quantiles = np.quantile(vel_arr, np.array([0.00, 0.25, 0.50, 0.75, 1.00]))
    ax.vlines(quantiles, [0] * quantiles.size, [1] * quantiles.size,
              color='b', ls=':', lw=0.5, zorder=0)
    ax.set_ylim(0.5, 1.5)
    ax.set_xticks(quantiles)
    plt.show()
    

    enter image description here