ChatGPT解决这个技术问题 Extra ChatGPT

How to change the figure size of a seaborn axes or figure level plot

How do I change the size of my image so it's suitable for printing?

For example, I'd like to use to A4 paper, whose dimensions are 11.7 inches by 8.27 inches in landscape orientation.


n
niraj

You can also set figure size by passing dictionary to rc parameter with key 'figure.figsize' in seaborn set method:

import seaborn as sns

sns.set(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


Unlike other solutions, this solution doesn't assume a certain way of defining the plot. Thanks.
Note that when you call sns.set(), it defaults your figure styles to the sns default instead of the matplotlib default, for example your figures would then suddenly have a grey background with white grid – see here: seaborn.pydata.org/tutorial/aesthetics.html. Also, this didn't have any effect on the size of my plot (a sns.pairplot).
Nor mine as a sns.boxplot
Thanks for that @Melissa. This made me realise I have to call .set() before .set_style()
Alas they both don't produce any plot in Jupyter Lab. 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".
C
Catalin Rusnac

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)

this solution does not seem to work with the code that follows (different kind of plot). Any ideas? I assume "mylib" is just a library where you stored your data and is not needed in this code: ` fig, ax = pyplot.subplots(figsize=(12,6)); sns.jointplot(memoryPrice['price'], memoryPrice['Memory']) `
This answer doesn't work in @TMWP's case because jointplot is a figure level method. See answer below.
this answer doesn't work with those plot types that don't accept ax as an input, for example sns.lmplot()
Plot size in seaborn should be set using the height and aspect parameters as explained here stackoverflow.com/a/51602446/2412831
@LeandroOrdonez that's not really applicable to axes-level function.
e
elz

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.


This is the only answer so far that correctly deals with sns plots that don't accept ax as an argument.
Note that height and aspect control the dimensions of a single "facet," i.e. a subplot. So this doesn't directly adjust the full figure dimensions.
S
Shubham Chaudhary

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)

J
Jianxun Li

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')

https://i.stack.imgur.com/uUFRv.png


this answer doesn't work with those plot types that don't accept ax as an input, for example sns.lmplot()
To expand on Chris's answer, some seaborn plots generate composite figures with multiple axes, so they CAN'T take a single axis as an argument.
This worked for me when trying to plot a violinplot. I was able to change the size of the figure inline in a Jupiter lab notebook.
P
PSN

This can be done using:

plt.figure(figsize=(15,8))
sns.kdeplot(data,shade=True)

+1 -- It would be really nice if you didn't have to import matplotlib.pyplot as plt to use this simple call to the figure. I wonder why they don't just expose it with sns.set_figure_size().
N
Nick Lothian

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)
Perhaps the API changed, but for me it was g.figure.set_figwidth instead of g.fig.set_figwidth. I'm using matplotlib version 3.1.0 and seaborn 0.9.0
works with seaborn version 0.11.1 - the other solutions on this page didn't work
Thank you so much, this is the only solution that has worked for me. Been trying to figure this out for like 15 minutes now
M
Mufaddal Tahir

This shall also work.

from matplotlib import pyplot as plt
import seaborn as sns    

plt.figure(figsize=(15,16))
sns.countplot(data=yourdata, ...)

h
head7

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).


This is the only solution that works for me with a FacetGrid 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")
Same here. It seems like 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
T
Trenton McKinney

Adjusting the size of the plot depends if the plot is a figure-level plot like seaborn.displot, or an axes-level plot like seaborn.histplot. This answer applies to any figure or axes level plots. See the the seaborn API reference

See the the seaborn API reference

seaborn is a high-level API for matplotlib, so seaborn works with matplotlib methods

Tested in python 3.8.12, matplotlib 3.4.3, seaborn 0.11.2

Imports and Data

import seaborn as sns
import matplotlib.pyplot as plt

# load data
df = sns.load_dataset('penguins')

sns.displot

The size of a figure-level plot can be adjusted with the height and/or aspect parameters

Additionally, the dpi 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)

Without p.fig.set_dpi(100)

https://i.stack.imgur.com/M1bo1.png

With p.fig.set_dpi(100)

https://i.stack.imgur.com/iO08m.png

sns.histplot

The size of an axes-level plot can be adjusted with 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)

Without dpi=100

https://i.stack.imgur.com/Y63Ll.png

With dpi=100

https://i.stack.imgur.com/nqINM.png


Can't one also do g.figure.set_size_inches(...) to change the size of a figure-level plot?
@BigBen there’s one below that has this option. plt.gcf().set_size_inches. I only add an option that wasn’t covered in previous answers.
J
Jerrold110
# 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()

https://i.stack.imgur.com/n1Npc.png


F
F.S.

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://stackoverflow.com/a/28765059/3901029


r
rmswrp

Some tried out ways:

import seaborn as sns
import matplotlib.pyplot as plt
ax, fig = plt.subplots(figsize=[15,7])
sns.boxplot(x="feature1", y="feature2",data=df) # 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