Comment puis-je changer la taille de la figure pour une parcelle marine?

223

Comment puis-je modifier la taille de mon image pour qu'elle soit adaptée à l'impression?

Par exemple, je voudrais utiliser du papier A4, dont les dimensions sont de 11,7 pouces par 8,27 pouces en orientation paysage.

Michael Grazebrook
la source

Réponses:

197

Vous devez créer à l'avance les objets Figure et Axes matplotlib, en spécifiant la taille de la figure:

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)
Paul H
la source
7
cette solution ne semble pas fonctionner avec le code qui suit (différent type de tracé). Des idées? Je suppose que "mylib" est juste une bibliothèque où vous avez stocké vos données et n'est pas nécessaire dans ce code: `fig, ax = pyplot.subplots (figsize = (12,6)); sns.jointplot (memoryPrice ['price'], memoryPrice ['Memory']) `
TMWP
3
Cette réponse ne fonctionne pas dans le cas de @ TMWP car jointplot est une méthode au niveau de la figure. Voir la réponse ci-dessous.
elz
5
cette réponse ne fonctionne pas avec les types de tracé qui n'acceptent pas ax comme entrée, par exemplesns.lmplot()
Chris
2
La taille du tracé dans seaborn doit être définie à l'aide des paramètres heightet aspectcomme expliqué ici stackoverflow.com/a/51602446/2412831
LeandroOrdonez
@LeandroOrdonez qui n'est pas vraiment applicable à la fonction au niveau des axes.
Paul H
234

Vous pouvez également définir la taille de la figure en passant le dictionnaire au rcparamètre avec la clé 'figure.figsize'dans la setméthode seaborn :

import seaborn as sns

sns.set(rc={'figure.figsize':(11.7,8.27)})

Autre alternative peut être d'utiliser figure.figsizede rcParamsla taille de la figure ci - dessous ensemble comme:

from matplotlib import rcParams

# figure size in inches
rcParams['figure.figsize'] = 11.7,8.27

Plus de détails peuvent être trouvés dans la documentation de matplotlib

étudiant
la source
5
Contrairement à d'autres solutions, cette solution ne suppose pas une certaine manière de définir l'intrigue. Merci.
LoMaPh
7
Notez que lorsque vous appelez sns.set (), vos styles de figures sont définis par défaut sur sns par défaut au lieu de matplotlib par défaut, par exemple, vos figures auraient soudainement un fond gris avec une grille blanche - voir ici: seaborn.pydata.org/ tutorial / esthetics.html . De plus, cela n'a eu aucun effet sur la taille de mon intrigue (un sns.pairplot).
Melissa
Ni le mien en tant que sns.boxplot
Gordon
Merci pour ça @Melissa. Cela m'a fait réaliser que je dois appeler .set()avant.set_style()
jorijnsmit
89

Vous pouvez définir le contexte sur posterou définir manuellement 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')

entrez la description de l'image ici

Jianxun Li
la source
3
cette réponse ne fonctionne pas avec les types de tracé qui n'acceptent pas ax comme entrée, par exemplesns.lmplot()
Chris
Pour développer la réponse de Chris, certaines parcelles marines génèrent des figures composites avec plusieurs axes, donc elles NE PEUVENT PAS prendre un seul axe comme argument.
Marmaduke
73

Notez que si vous essayez de passer à une méthode "au niveau de la figure" dans seaborn (par exemple lmplot, catplot/ factorplot, jointplot) vous pouvez et devez le spécifier dans les arguments en utilisant heightet aspect.

sns.catplot(data=df, x='xvar', y='yvar', 
    hue='hue_bar', height=8.27, aspect=11.7/8.27)

Voir https://github.com/mwaskom/seaborn/issues/488 et Plotting with seaborn à l'aide de l'interface orientée objet matplotlib pour plus de détails sur le fait que les méthodes au niveau des figures n'obéissent pas aux spécifications des axes.

elz
la source
11
C'est la seule réponse à ce jour qui traite correctement les tracés sns qui n'acceptent pas ax comme argument.
Melissa
Notez que la hauteur et l'aspect contrôlent les dimensions d'une seule "facette", c'est-à-dire une sous-intrigue. Donc, cela n'ajuste pas directement les dimensions complètes de la figure.
bernie
43

importer d'abord matplotlib et l'utiliser pour définir la taille de la 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)
Gucci148
la source
20

Cela peut être fait en utilisant:

plt.figure(figsize=(15,8))
sns.kdeplot(data,shade=True)
PSN
la source
19

Cela fonctionnera également.

from matplotlib import pyplot as plt
import seaborn as sns    

plt.figure(figsize=(15,16))
sns.countplot(data=yourdata, ...)
Mufaddal Tahir
la source
16

Pour mon intrigue (un facteur factoriel sns), la réponse proposée ne fonctionnait pas bien.

Ainsi j'utilise

plt.gcf().set_size_inches(11.7, 8.27)

Juste après l'intrigue avec seaborn (donc pas besoin de passer une hache à seaborn ou de changer les paramètres rc).

head7
la source
1
C'est la seule solution qui fonctionne pour moi avec un FacetGridpython 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")
Nicolas78
Pareil ici. Il semble que vous définiriez sns.FacetGridune taille de figure en fonction d'une valeur calculée (définie par heightet aspect) et que la modification de la taille de la figure directement après le tracé de Seaborn fonctionne. Et un autre réglage fin de l'intrigue peut se produire après avoir changé la taille de la figure
Yunting Zhao
16

En plus de la réponse d' elz concernant les méthodes "au niveau de la figure" qui retournent des objets de grille multi-tracé, il est possible de définir la hauteur et la largeur de la figure de manière explicite (c'est-à-dire sans utiliser le rapport hauteur / largeur) en utilisant l'approche suivante:

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)
dmainz
la source
set_figwidthet set_figheightfonctionnent bien pour les objets de la grille. >>> importez seaborn >>> importez matplotlib.pyplot comme 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)
Paul Rougieux
1
Peut-être que l'API a changé, mais pour moi, c'était g.figure.set_figwidth au lieu de g.fig.set_figwidth. J'utilise matplotlib version 3.1.0 et seaborn 0.9.0
NateW
6

Les meilleures réponses de Paul H et J. Li ne fonctionnent pas pour tous les types de personnages nés de la mer. Pour le FacetGridtype (par exemple sns.lmplot()), utilisez le paramètre sizeet aspect.

Size modifie à la fois la hauteur et la largeur, en conservant le rapport hauteur / largeur.

Aspect ne change que la largeur, en gardant la hauteur constante.

Vous pouvez toujours obtenir la taille souhaitée en jouant avec ces deux paramètres.

Crédit: https://stackoverflow.com/a/28765059/3901029

Chris
la source