Skip to content
Advertisement

Different binwidth for each plot in FacetGrid Seaborn

I would like to give each histplot in FacetGrid from seaborn a different binwidth. To give each plot a binwidth of 3 is possible like this:

import seaborn as sns

sns.set_theme(style="darkgrid")
tips = sns.load_dataset("tips")

g = sns.FacetGrid(tips, col="day", height=3.5, aspect=.65)
g.map(sns.histplot, "total_bill", binwidth = 3)

Output:

enter image description here

But let’s say you want to give each plot a different binwidth, for example 1,2,3 and 4 in a list, the following error appears:

g = sns.FacetGrid(tips, col="day", height=3.5, aspect=.65)
g.map(sns.histplot, "total_bill", binwidth = [1,2,3,4])

Error:

TypeError: unsupported operand type(s) for +: 'float' and 'list'

So I was wondering if anyone knows how to give each plot in the FacetGrid a different binwidth using seaborn?

Advertisement

Answer

You could loop simultaneously through g.axes_dict and the widths, and call the function separately for each subplot. You’ll need to manually create the correct subset of the dataframe.

import seaborn as sns

sns.set_theme(style="darkgrid")
tips = sns.load_dataset("tips")

g = sns.FacetGrid(tips, col="day", height=3.5, aspect=.65)
for (day, ax), binwidth in zip(g.axes_dict.items(), [1, 2, 3, 4]):
    sns.histplot(tips[tips["day"] == day]['total_bill'], binwidth=binwidth, ax=ax)
    ax.set_title(f'day={day} binwidth={binwidth}')

sns.FacetGrid with individual parameters

User contributions licensed under: CC BY-SA
5 People found this is helpful
Advertisement