Come faccio a cambiare la dimensione della figura per un diagramma dei nati marini?


224

Come posso modificare le dimensioni della mia immagine in modo che sia adatta alla stampa?

Ad esempio, vorrei utilizzare la carta A4, le cui dimensioni sono 11,7 pollici per 8,27 pollici in orientamento orizzontale.

Risposte:


197

È necessario creare in anticipo gli oggetti Figure e Axes matplotlib, specificando quanto è grande la figura:

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)

7
questa soluzione non sembra funzionare con il codice che segue (diverso tipo di trama). Qualche idea? Suppongo che "mylib" sia solo una libreria in cui sono stati memorizzati i dati e non è necessario in questo codice: `fig, ax = pyplot.subplots (figsize = (12,6)); sns.jointplot (memoryPrice ['price'], memoryPrice ['Memory']) `
TMWP

3
Questa risposta non funziona nel caso di @ TMWP perché jointplot è un metodo a livello di figura. Vedi la risposta sotto.
elz,

5
questa risposta non funziona con questi tipi di trama che non accettano l'ascia come input, ad esempiosns.lmplot()
Chris

2
Superficie del terreno in Seaborn deve essere impostato utilizzando i heighte aspectparametri come spiegato qui stackoverflow.com/a/51602446/2412831
LeandroOrdonez

@LeandroOrdonez non è realmente applicabile alla funzione a livello di assi.
Paolo H,

234

Puoi anche impostare la dimensione della figura passando il dizionario al rcparametro con la chiave 'figure.figsize'nel setmetodo seaborn :

import seaborn as sns

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

Un'altra alternativa potrebbe essere l'uso figure.figsizedi rcParamsper impostare la dimensione della figura come di seguito:

from matplotlib import rcParams

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

Maggiori dettagli sono disponibili nella documentazione di matplotlib


5
A differenza di altre soluzioni, questa soluzione non assume un certo modo di definire la trama. Grazie.
LoMaPh

7
Nota che quando chiami sns.set (), per impostazione predefinita i tuoi stili di figura sono quelli predefiniti di sns invece di quelli di matplotlib, ad esempio le tue figure avrebbero improvvisamente uno sfondo grigio con griglia bianca - vedi qui: seaborn.pydata.org/ tutorial / aesthetics.html . Inoltre, questo non ha avuto alcun effetto sulla dimensione della mia trama (un diagramma di snspair).
Melissa,

Né il mio come sns.boxplot
Gordon,

Grazie per quello @ Melissa. Questo mi ha fatto capire che devo chiamare .set()prima.set_style()
jorijnsmit il

90

È possibile impostare il contesto da posterimpostare o impostare manualmente 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')

inserisci qui la descrizione dell'immagine


3
questa risposta non funziona con questi tipi di trama che non accettano l'ascia come input, ad esempiosns.lmplot()
Chris

Per espandere la risposta di Chris, alcune trame marine generano figure composte con più assi, quindi NON POSSONO prendere un singolo asse come argomento.
Marmaduke,

74

Si noti che se si sta tentando di passare a un metodo di "livello di figura" in Seaborn (ad esempio lmplot, catplot/ factorplot, jointplot) è possibile e deve specificarlo negli argomenti utilizzando heighte aspect.

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

Vedere https://github.com/mwaskom/seaborn/issues/488 e Tracciare con Seaborn usando l'interfaccia orientata agli oggetti matplotlib per maggiori dettagli sul fatto che i metodi a livello di figura non obbediscono alle specifiche degli assi.


12
Questa è l'unica risposta finora che affronta correttamente i grafici sns che non accettano ax come argomento.
Melissa,

Si noti che altezza e aspetto controllano le dimensioni di una singola "faccetta", ovvero una trama secondaria. Quindi questo non regola direttamente le dimensioni della figura intera.
Bernard

43

prima importare matplotlib e usarlo per impostare la dimensione della figura

from matplotlib import pyplot as plt
import seaborn as sns

plt.figure(figsize=(15,8))
ax = sns.barplot(x="Word", y="Frequency", data=boxdata)

20

Questo può essere fatto usando:

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

19

Anche questo dovrebbe funzionare.

from matplotlib import pyplot as plt
import seaborn as sns    

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

16

Per la mia trama (un fattore grafico sns) la risposta proposta non ha funzionato bene.

Quindi io uso

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

Subito dopo la trama con Seaborn (quindi non è necessario passare un'ascia a Seaborn o modificare le impostazioni RC).


1
Questa è l'unica soluzione che funziona per me con una 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,

Anch'io. Sembra sns.FacetGridche imposterebbe una dimensione della figura in base a un valore calcolato (impostato da heighte aspect) e modificando la dimensione della figura direttamente dopo il disegno del neonato funzionerà. E dopo la modifica delle dimensioni della figura può accadere un'altra messa a punto della trama
Yunting Zhao,

16

Oltre alla risposta elz relativa ai metodi di "livello di figura" che restituiscono oggetti griglia multiplot, è possibile impostare in modo esplicito l'altezza e la larghezza della figura (ovvero senza utilizzare le proporzioni) utilizzando il seguente approccio:

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_figwidthe set_figheightfunziona bene per gli oggetti della griglia. >>> importa seaborn >>> importa matplotlib.pyplot come pyplot >>> tips = seaborn.load_dataset ("tips") >>> g = seaborn.FacetGrid (tips, col = "time", row = "fumatore") >>> g = g.map (pyplot.hist, "total_bill") >>> g.fig.set_figwidth (10) >>> g.fig.set_figheight (10)
Paul Rougieux,

1
Forse l'API è cambiata, ma per me è stata g.figure.set_figwidth invece di g.fig.set_figwidth. Sto usando Matplotlib versione 3.1.0 e Seaborn 0.9.0
NateW

6

Le risposte migliori di Paul H e J. Li non funzionano per tutti i tipi di figure marine. Per il FacetGridtipo (ad esempio sns.lmplot()), utilizzare il parametro sizee aspect.

Size cambia sia l'altezza che la larghezza, mantenendo le proporzioni.

Aspect cambia solo la larghezza, mantenendo l'altezza costante.

Puoi sempre ottenere la dimensione desiderata giocando con questi due parametri.

Credito: https://stackoverflow.com/a/28765059/3901029

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.