How can I change the Seaborn FacetGrid's legend title?

Question:

In the Seaborn’s FacetGrid based lineplot, would like to change the label title. It seemed like a simple thing, but it turned out to be a hairy task

tips = sns.load_dataset("tips")
g = sns.FacetGrid(tips, col= 'day', legend_out= True,)
g.map(sns.lineplot, 'total_bill', 'tip', 'sex', 'time',
     ci = False)    
g.fig.legend()

legend title ‘sex’

I wanted to change the label title to ‘gender’ from ‘sex’ by adding ‘title’ argument. But it turns out that become a headline on top the existing title

g.add_legend(title = 'Gender')

legend title ‘sex’ with headline ‘Gender’

I also tried to access the fig.legend to change the text, but now it shows multiple legends, probably due to the multi-faceted plots.

l = g.fig.legend()
l.texts[0].set_text('Gender')

legend title ‘Gender’, however, with multiple legends

I am sure there may be a ‘hacky’ way to change the name by changing the variable names in the data or so, but I am wondering whether there is a way to simply replace the Seabron FacetGrid’s legend title or, if it is not possible, add the title through ‘fig.legend’ while showing single relevant legend. Many thanks!

Asked By: jameskim

||

Answers:

Why not replace the name of the "sex" columns with "Gender"?

import matplotlib.pyplot as plt
import seaborn as sns

tips = sns.load_dataset("tips")
tips.columns = [n if n != "sex" else "Gender" for n in tips.columns]

g = sns.FacetGrid(tips, col= 'day')
g.map(sns.lineplot, 'total_bill', 'tip', 'Gender', 'time',
     ci = False)    
g.add_legend()

plt.show()

enter image description here

After adding the legend using the FacetGrid.add_legend() method, you can then directly access the underlying matplotlib.legend.Legend object to reset the text by chaining the get_text() (which in this case is the first of the six elements and hence indexed as 0, but you could likewise change the ‘time’ label using index 3) and set_text() methods:

tips = sns.load_dataset("tips")
g = sns.FacetGrid(tips, col= 'day')
g.map(sns.lineplot, 'total_bill', 'tip', 'sex', 'time',
     errorbar=('ci', False))
g.add_legend()
g.legend.get_texts()[0].set_text('Gender')
plt.show()

enter image description here

Answered By: freesoup
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.