143

How do I add a title to this Seaborne plot? Let's give it a title 'I AM A TITLE'.

tips = sns.load_dataset("tips")
g = sns.FacetGrid(tips, col="sex", row="smoker", margin_titles=True)
g.map(sns.plt.scatter, "total_bill", "tip")

plot

Trenton McKinney
  • 56,955
  • 33
  • 144
  • 158
collarblind
  • 4,549
  • 13
  • 31
  • 49

7 Answers7

267

Updating slightly, with seaborn 0.11.1:

Seaborn's relplot function creates a FacetGrid and gives each subplot its own explanatory title. You can add a title over the whole thing:

import seaborn as sns
tips = sns.load_dataset('tips')

rp = sns.relplot(data=tips, x='total_bill', y='tip',
                 col='sex', row='smoker',
                 kind='scatter')
# rp is a FacetGrid; 
# relplot is a nice organized way to use it

rp.fig.subplots_adjust(top=0.9) # adjust the Figure in rp
rp.fig.suptitle('ONE TITLE FOR ALL')

Two-by-two grid of scatterplots. Each sub-plot has a title; the grid has a suptitle over all

If you create the FacetGrid directly, as in the original example, it automatically adds column and row labels instead of individual subplot titles. We can still add a title to the whole thing:

from matplotlib.pyplot import scatter as plt_scatter
g = sns.FacetGrid(tips, col='sex', row='smoker', 
                  margin_titles=True)
g.map(plt_scatter, 'total_bill', 'tip')
g.fig.subplots_adjust(top=0.9)
g.fig.suptitle('TITLE!')

Two-by-two grid of scatterplots. Each column has a title and the overall grid has a supertitle.

The FacetGrid objects are built with matplotlib Figure objects, so we can use subplots_adjust, suptitle that may be familiar from matplotlib in general.

cphlewis
  • 15,759
  • 4
  • 46
  • 55
  • 8
    This worked for me but I had to use `plt.subplots_adjust(top=0.8)` instead of `top=0.9`. – Mack Jan 12 '18 at 09:42
  • 7
    `suptitle` also has a `y` parameter. This worked for me: `g.fig.suptitle('foo', y=1.05)` – trianta2 Apr 22 '19 at 16:29
  • 2
    This does not work if you use `col_wrap` as then both the figure and the last axes subplot (bottom right) will inherit the same title. – xApple May 21 '19 at 14:20
  • 1
    instead of fiddling with the margins with `subplots_adjust()` simply calling `plt.tight_layout()` often times does the job quite nicely for you :) – emilaz Nov 22 '21 at 10:03
48
g.fig.subplots_adjust(top=0.9)
g.fig.suptitle('Title', fontsize=16)

More info here: http://matplotlib.org/api/figure_api.html

Taras
  • 717
  • 6
  • 4
22

In ipython notebook, this worked for me!

sns.plt.title('YOUR TITLE HERE')
Meera Lakhavani
  • 285
  • 3
  • 2
2

What worked for me was:

sns.plt.suptitle('YOUR TITLE HERE')

pmetzner
  • 95
  • 1
  • 2
  • 2
    AttributeError: module 'seaborn' has no attribute 'plt' – xApple May 21 '19 at 14:22
  • While this _can_ work if seaborn exposes it's matplotlib import, it's very bad practice to rely on another package to import your dependencies for you. You should just add `import matplotlib.pyplot as plt` in your code and use `plt.suptitle` directly. – Mack Aug 10 '21 at 19:11
0

The answers using sns.plt.title() and sns.plt.suptitle() don't work anymore.

Instead, you need to use matplotlib's title() function:

import matplotlib.pyplot as plt
sns.FacetGrid(<whatever>)
plt.title("A title")
crypdick
  • 16,152
  • 7
  • 51
  • 74
0
plt.suptitle("Title") 

or

plt.title("Title")

This worked for me.

  • The second solution doesn't work, while the first solution creates an ugly interlay of suptitle and facet titles. You need to use using coordinates. – MERose Aug 30 '20 at 14:11
0

The title will not be center aligned with the subplot titles. To set the position of the title you can use plt.suptitle("Title", x=center)

In my case, my subplots were in a 2x1 grid, so I was able to use bbox = g.axes[0,0].get_position() to find the bounding box and then center=0.5*(bbox.x1+bbox.x2)

ndw
  • 513
  • 6
  • 14