How do I change the size of my image so it's suitable for printing?
For example, I'd like to use an A4 paper, whose dimensions are 11.7 inches by 8.27 inches in landscape orientation.
How do I change the size of my image so it's suitable for printing?
For example, I'd like to use an A4 paper, whose dimensions are 11.7 inches by 8.27 inches in landscape orientation.
You need to create the matplotlib Figure and Axes objects ahead of time, specifying how big the figure is:
from matplotlib import pyplot
import seaborn
import mylib
a4_dims = (11.7, 8.27)
df = mylib.load_data()
fig, ax = pyplot.subplots(figsize=a4_dims)
seaborn.violinplot(ax=ax, data=df, **violin_options)
sns.lmplot()
–
Moriarty height
and aspect
parameters as explained here https://mcmap.net/q/73969/-how-to-change-the-figure-size-of-a-seaborn-axes-or-figure-level-plot –
Alfaro You can also set figure size by passing dictionary to rc
parameter with key 'figure.figsize'
in seaborn set_theme
method (which replaces the set
method, deprecated in v0.11.0 (September 2020))
import seaborn as sns
sns.set_theme(rc={'figure.figsize':(11.7,8.27)})
Other alternative may be to use figure.figsize
of rcParams
to set figure size as below:
from matplotlib import rcParams
# figure size in inches
rcParams['figure.figsize'] = 11.7,8.27
More details can be found in matplotlib documentation
.set()
before .set_style()
–
Augmenter fig, ax = pyplot.subplots(figsize=(20, 2)); a = sns.lineplot(ax=ax, x=..., y=...)
instead works as expected. I am always surprised when such parameters, that should be straightforward in seaborn because used very often, need to be set using "tricks". –
Prehistory sns.set()
(and sns.set_style()
) have to precede the plot (and sns.set_style()
has to precede plt.subplots()
, if you go for this alternative). –
Crackpot You need to create the matplotlib Figure and Axes objects ahead of time, specifying how big the figure is:
from matplotlib import pyplot
import seaborn
import mylib
a4_dims = (11.7, 8.27)
df = mylib.load_data()
fig, ax = pyplot.subplots(figsize=a4_dims)
seaborn.violinplot(ax=ax, data=df, **violin_options)
sns.lmplot()
–
Moriarty height
and aspect
parameters as explained here https://mcmap.net/q/73969/-how-to-change-the-figure-size-of-a-seaborn-axes-or-figure-level-plot –
Alfaro Note that if you are trying to pass to a "figure level" method in seaborn (for example lmplot
, catplot
/ factorplot
, jointplot
) you can and should specify this within the arguments using height
and aspect
.
sns.catplot(data=df, x='xvar', y='yvar',
hue='hue_bar', height=8.27, aspect=11.7/8.27)
See https://github.com/mwaskom/seaborn/issues/488 and Plotting with seaborn using the matplotlib object-oriented interface for more details on the fact that figure level methods do not obey axes specifications.
relplot
too. Even when creating a figure ahead of time using plt.figure(figsize=...)
, I still needed to specify height
/aspect
to get the dimensions to change. I prefer this much more than the sns.set()
solution because I want different values for different plots. –
Biblio first import matplotlib and use it to set the size of the figure
from matplotlib import pyplot as plt
import seaborn as sns
plt.figure(figsize=(15,8))
ax = sns.barplot(x="Word", y="Frequency", data=boxdata)
You can set the context to be poster
or manually set fig_size
.
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
np.random.seed(0)
n, p = 40, 8
d = np.random.normal(0, 2, (n, p))
d += np.log(np.arange(1, p + 1)) * -5 + 10
# plot
sns.set_style('ticks')
fig, ax = plt.subplots()
# the size of A4 paper
fig.set_size_inches(11.7, 8.27)
sns.violinplot(data=d, inner="points", ax=ax)
sns.despine()
fig.savefig('example.png')
sns.lmplot()
–
Moriarty This can be done using:
plt.figure(figsize=(15,8))
sns.kdeplot(data,shade=True)
In addition to elz answer regarding "figure level" methods that return multi-plot grid objects it is possible to set the figure height and width explicitly (that is without using aspect ratio) using the following approach:
import seaborn as sns
g = sns.catplot(data=df, x='xvar', y='yvar', hue='hue_bar')
g.fig.set_figwidth(8.27)
g.fig.set_figheight(11.7)
set_figwidth
and set_figheight
work well for grid objects. >>> import seaborn >>> import matplotlib.pyplot as pyplot >>> tips = seaborn.load_dataset("tips") >>> g = seaborn.FacetGrid(tips, col="time", row="smoker") >>> g = g.map(pyplot.hist, "total_bill") >>> g.fig.set_figwidth(10) >>> g.fig.set_figheight(10) –
Mariomariology 0.11.1
- the other solutions on this page didn't work –
Showthrough This shall also work.
from matplotlib import pyplot as plt
import seaborn as sns
plt.figure(figsize=(15,16))
sns.countplot(data=yourdata, ...)
For my plot (a sns factorplot) the proposed answer didn't works fine.
Thus I use
plt.gcf().set_size_inches(11.7, 8.27)
Just after the plot with seaborn (so no need to pass an ax to seaborn or to change the rc settings).
python g = sns.FacetGrid(df.set_index('category'), col="id") pyplot.gcf().set_size_inches(11.7, 8.27) g.map(lambda data, color: data.plot.barh(color=color), "count")
–
Quicken sns.FacetGrid
would set a figure size according to a calculated value (set by height
and aspect
) and changing the figure size directly after seaborn plotting will work. And other fine tuning of the plot can happen after changing the figure size –
Bronson seaborn.objects
interface from seaborn v0.12
, which is not the same as seaborn axes-level or figure-level plots.seaborn.displot
, or an axes-level plot like seaborn.histplot
. This answer applies to any figure or axes level plots.
seaborn
is a high-level API for matplotlib
, so seaborn works with matplotlib methodspython 3.8.12
, matplotlib 3.4.3
, seaborn 0.11.2
import seaborn as sns
import matplotlib.pyplot as plt
# load data
df = sns.load_dataset('penguins')
sns.displot
height
and/or aspect
parametersdpi
of the figure can be set by accessing the fig
object and using .set_dpi()
p = sns.displot(data=df, x='flipper_length_mm', stat='density', height=4, aspect=1.5)
p.fig.set_dpi(100)
p.fig.set_dpi(100)
p.fig.set_dpi(100)
sns.histplot
figsize
and/or dpi
# create figure and axes
fig, ax = plt.subplots(figsize=(6, 5), dpi=100)
# plot to the existing fig, by using ax=ax
p = sns.histplot(data=df, x='flipper_length_mm', stat='density', ax=ax)
dpi=100
dpi=100
# Sets the figure size temporarily but has to be set again the next plot
plt.figure(figsize=(18,18))
sns.barplot(x=housing.ocean_proximity, y=housing.median_house_value)
plt.show()
plt.figure(figsize=(X,Y))
does nothing, at least with the Jupyter extension in VS Code and seaborn 0.12.2 –
Petulah Some tried out ways:
import seaborn as sns
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=[15,7])
sns.boxplot(x="feature1", y="feature2",data=df, ax=ax) # where df would be your dataframe
or
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=[15,7])
sns.boxplot(x="feature1", y="feature2",data=df) # where df would be your dataframe
The top answers by Paul H and J. Li do not work for all types of seaborn figures. For the FacetGrid
type (for instance sns.lmplot()
), use the size
and aspect
parameter.
Size
changes both the height and width, maintaining the aspect ratio.
Aspect
only changes the width, keeping the height constant.
You can always get your desired size by playing with these two parameters.
Credit: https://mcmap.net/q/47213/-how-to-change-figuresize-using-seaborn-factorplot
Seaborn has plotter functions that return Axes objects. The size of those plots can be changed globally using the set()
or set_theme()
functions (as given in niraj's answer).
import seaborn as sns
df = sns.load_dataset("tips")
sns.set_theme(rc={'figure.figsize': (8.27, 11.7)})
ax = sns.regplot(df, x='total_bill', y='tip')
The size of these plots can also be changed by changing the size of the underlying matplotlib figure that contains this Axes using set_size_inches()
. Note that dmainz's answer's answer does a similar thing but it works by setting the width and height separately; this method sets them both in one function call. This is especially useful if your seaborn plot is created somewhere else and you want to change its size to whatever you want in inches.
ax = sns.regplot(df, x='total_bill', y='tip') # the default figsize is 6.4"x4.8"
ax.figure.set_size_inches(8.27, 11.7) # now it becomes 8.27"x11.7"
If your seaborn plot is generated by the function that doesn't return a value, then you can still change it by accessing the current figure object using plt.gcf()
. For example:
import matplotlib.pyplot as plt
sns.regplot(df, x='total_bill', y='tip')
plt.gcf().set_size_inches(8.27, 11.7)
Note that set()
or set_theme()
changes the figure size globally which may not be desirable if you only want to set a specific size of a single figure and use the default settings for others. In that case, you can use a context manager to change the figsize of a single figure.
with plt.rc_context(rc={'figure.figsize': (8.27, 11.7)}):
sns.regplot(df, x='total_bill', y='tip')
Similar to above where the underlying matplotlib figure size was changed, the same can be done for FacetGrid objects as well. A demo goes as follows:
g = sns.lmplot(data=df, x='total_bill', y='tip') # the default figsize is 5"x5"
g.fig.set_size_inches(8.27, 11.7) # now it becomes 8.27"x11.7"
Note that if your seaborn figure is generated by the function that doesn't return a value, then you can still change it by accessing the current figure object using plt.gcf()
:
sns.lmplot(data=df, x='total_bill', y='tip')
plt.gcf().set_size_inches(8.27, 11.7)
© 2022 - 2024 — McMap. All rights reserved.