Skip to content

Distribution Plots (displot, histplot)

Why distribution plots matter

Distribution plots answer:

  • What values are most common?
  • Is the data skewed?
  • Are there outliers?
  • Do groups behave differently?
diagram How histplot builds a histogram mermaid
Values are sorted into equal-width bins, counted, then drawn as bars — with an optional KDE curve laid on top.

histplothistplot (single plot)

histplot
import seaborn as sns
import matplotlib.pyplot as plt
 
values = [55, 60, 62, 63, 65, 67, 70, 72, 76, 80, 81, 85, 90, 92, 95]
 
plt.figure(figsize=(7, 4))
sns.histplot(values, bins=8, kde=False)
plt.title("Histogram")
plt.xlabel("Value")
plt.ylabel("Count")
plt.tight_layout()
plt.show()
histplot
import seaborn as sns
import matplotlib.pyplot as plt
 
values = [55, 60, 62, 63, 65, 67, 70, 72, 76, 80, 81, 85, 90, 92, 95]
 
plt.figure(figsize=(7, 4))
sns.histplot(values, bins=8, kde=False)
plt.title("Histogram")
plt.xlabel("Value")
plt.ylabel("Count")
plt.tight_layout()
plt.show()

Add KDE on top

histplot + kde
import seaborn as sns
import matplotlib.pyplot as plt
 
plt.figure(figsize=(7, 4))
sns.histplot(values, bins=8, kde=True)
plt.title("Histogram + KDE")
plt.tight_layout()
plt.show()
histplot + kde
import seaborn as sns
import matplotlib.pyplot as plt
 
plt.figure(figsize=(7, 4))
sns.histplot(values, bins=8, kde=True)
plt.title("Histogram + KDE")
plt.tight_layout()
plt.show()

Visualize it

Bars count how many points land in each bin. The smooth curve is a KDE — an estimate of the underlying probability density that doesn’t depend on where the bin edges happen to fall:

sketch Histogram bars with a KDE curve p5.js
Amber bars are the binned counts; the blue curve is the smooth density estimate drawn over them.

displotdisplot (figure-level)

displotdisplot can create more complex plots and handles facets.

displot
import seaborn as sns
 
# Seaborn includes sample datasets
 
tips = sns.load_dataset("tips")
 
sns.displot(data=tips, x="total_bill", bins=20, kde=True)
displot
import seaborn as sns
 
# Seaborn includes sample datasets
 
tips = sns.load_dataset("tips")
 
sns.displot(data=tips, x="total_bill", bins=20, kde=True)

Compare distributions by group

Compare groups
import seaborn as sns
import matplotlib.pyplot as plt
 
tips = sns.load_dataset("tips")
 
plt.figure(figsize=(7, 4))
sns.histplot(data=tips, x="total_bill", hue="sex", bins=20, kde=True, element="step")
plt.title("Total bill distribution by sex")
plt.tight_layout()
plt.show()
Compare groups
import seaborn as sns
import matplotlib.pyplot as plt
 
tips = sns.load_dataset("tips")
 
plt.figure(figsize=(7, 4))
sns.histplot(data=tips, x="total_bill", hue="sex", bins=20, kde=True, element="step")
plt.title("Total bill distribution by sex")
plt.tight_layout()
plt.show()

Tips

  • Use the same bin settings when comparing groups.
  • KDE is a smooth estimate; it can hide small details.
  • For heavy outliers, consider log scaling.

Next

Continue to Kernel Density Estimation (KDE) to look at the smooth curve on its own, and learn how bandwidth controls its shape.

🧪 Try It Yourself

Exercise 1 – A Basic Histogram

Exercise 2 – Add a KDE Curve

Exercise 3 – Compare Groups by Column

If this helped you, consider buying me a coffee ☕

Buy me a coffee

Was this page helpful?

Let us know how we did