61

Using the examples from seaborn.pydata.org and the Python DataScience Handbook, I'm able to produce a combined distribution plot with the following snippet:

Code:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

# some settings
sns.set_style("darkgrid")

# Create some data
data = np.random.multivariate_normal([0, 0], [[5, 2], [2, 2]], size=2000)
data = pd.DataFrame(data, columns=['x', 'y'])

# Combined distributionplot
sns.distplot(data['x'])
sns.distplot(data['y'])

Plot: enter image description here

How can I combine this setup with vertical lines so that I can illustrate thresholds like this:

enter image description here

I know I can do it with matplotlib like here Dynamic histogram subplots with line to mark target, but I really like the simplicity of seaborn plots and would like to know if it's possible to do it more elegantly (and yes, I know that seaborn builds on top of matplotlib).

Trenton McKinney
  • 56,955
  • 33
  • 144
  • 158
vestland
  • 55,229
  • 37
  • 187
  • 305
  • This is a [duplicate](https://stackoverflow.com/q/24988448/7758804) because `plt.axvline` is [already covered (Jul 28, 2014)](https://stackoverflow.com/a/24988486/7758804). The implementation here is not different because it's a distribution, or seaborn (distplot has been removed). Additionally, there's a better description, and more options in the duplicate. – Trenton McKinney Apr 05 '23 at 23:00

1 Answers1

95

Just use

plt.axvline(2.8, 0,0.17)

And the same for the other line

Here instead of 0.17 you can put the maxima of your distribution using some variable such as maxx = max(data) or something similar. 2.8 is the position on the x-axis. Oh remember that the y-value has to be in between 0 and 1 where 1 is the top of the plot. You can rescale your values accordingly. Another obvious option is simply

plt.plot([2.8, 2.8], [0, max(data)])
Sheldore
  • 37,862
  • 7
  • 57
  • 71