taras
taras

Reputation: 6915

Scale figure's font with seaborn while preserving matplotlib's style

I have some predefined matplotlibrc style which I use for my plots. Below is a sample image styled with it

enter image description here

On the other hand, I find seaborn's sns.set(font_scale=1.25) quite handy, which allows me to quickly control font sizes.
Yet, while changing the font size it also applies the default seaborn style to my plot, so matplotlib's defaults are overwritten.
I tried sns.set(style=None, font_scale=1.25) instead but line colors and font family of axis labels are still changed.

enter image description here

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

#sns.set(style=None, font_scale=1.25)

fig = plt.figure(figsize=(3.4, 2.1), frameon=False)
fig.tight_layout()

x = np.linspace(0, 2, 500)

ax = fig.add_subplot(111)
ax.set_xlabel('xlabel, some units')
ax.set_ylabel('ylabel, some units')

ax.plot(x, x**0.5, label='$x^{0.5}$')
ax.plot(x, x**1.5, label='$x^{1.5}$')
ax.legend()

fig.savefig('output.png')
plt.close(fig)

Upvotes: 4

Views: 3390

Answers (2)

Diziet Asahi
Diziet Asahi

Reputation: 40707

One possibility is to rite your own function that reproduces what seaborn is doing "under the hood"

This is adapted from seaborn's code on github:

def scale_fonts(font_scale):
    font_keys = ["axes.labelsize", "axes.titlesize", "legend.fontsize",
             "xtick.labelsize", "ytick.labelsize", "font.size"]
    font_dict = {k: matplotlib.rcParams[k] * font_scale for k in font_keys}
    matplotlib.rcParams.update(font_dict)

You have to make sure the values for the font_keys above are in numeric (e.g. 12 and not "medium") in your rc-file, but otherwise, that's all there is to it.

Upvotes: 2

ImportanceOfBeingErnest
ImportanceOfBeingErnest

Reputation: 339340

You are looking for set_context:

sns.set_context("notebook", font_scale=1.25)

This will scale the fonts with respect to the predefined "notebook" style, which seems closest to the matplotlib defaults.

A comparisson:

Default plot:

enter image description here

With sns.set_context(font_scale=1.25):

enter image description here

With sns.set_context("notebook", font_scale=1.25):

enter image description here

Upvotes: 4

Related Questions