¿Cómo cambio el tamaño de la figura para una parcela marina?

223

¿Cómo cambio el tamaño de mi imagen para que sea adecuada para imprimir?

Por ejemplo, me gustaría usar para papel A4, cuyas dimensiones son 11.7 pulgadas por 8.27 pulgadas en orientación horizontal.

Michael Grazebrook
fuente

Respuestas:

197

Debe crear los objetos Matplotlib Figure y Axes con anticipación, especificando qué tan grande es 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)
Paul H
fuente
77
esta solución no parece funcionar con el código que sigue (diferentes tipos de trama). ¿Algunas ideas? Supongo que "mylib" es solo una biblioteca donde almacenó sus datos y no es necesaria en este código: `fig, ax = pyplot.subplots (figsize = (12,6)); sns.jointplot (memoryPrice ['price'], memoryPrice ['Memory']) `
TMWP
3
Esta respuesta no funciona en el caso de @ TMWP porque jointplot es un método de nivel de figura. Ver la respuesta a continuación.
elz
55
esta respuesta no funciona con esos tipos de trama que no aceptan ax como entrada, por ejemplosns.lmplot()
Chris
2
El tamaño de la parcela en seaborn debe establecerse utilizando los parámetros heighty aspectcomo se explica aquí stackoverflow.com/a/51602446/2412831
LeandroOrdonez
@LeandroOrdonez que no es realmente aplicable a la función de nivel de ejes.
Paul H
234

También puede establecer el tamaño de la figura pasando el diccionario al rcparámetro con la clave 'figure.figsize'en el setmétodo seaborn :

import seaborn as sns

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

Otra alternativa puede ser utilizar figure.figsizede rcParamsestablecer tamaño de figura a continuación:

from matplotlib import rcParams

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

Se pueden encontrar más detalles en la documentación de matplotlib

estudiante
fuente
55
A diferencia de otras soluciones, esta solución no asume una cierta forma de definir la trama. Gracias.
LoMaPh
66
Tenga en cuenta que cuando llama a sns.set (), el estilo predeterminado de sus figuras es el valor predeterminado de sns en lugar del valor predeterminado de matplotlib, por ejemplo, sus figuras de repente tendrían un fondo gris con una cuadrícula blanca; consulte aquí: seaborn.pydata.org/ tutorial / aesthetics.html . Además, esto no tuvo ningún efecto en el tamaño de mi trama (un sns.pairplot).
Melissa
Ni la mía como sns.boxplot
Gordon
Gracias por eso @Melissa. Esto me hizo darse cuenta de que tengo que llamar .set()antes.set_style()
jorijnsmit
89

Puede establecer el contexto para ser postero establecer 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')

ingrese la descripción de la imagen aquí

Jianxun Li
fuente
3
esta respuesta no funciona con esos tipos de trama que no aceptan ax como entrada, por ejemplosns.lmplot()
Chris
Para ampliar la respuesta de Chris, algunas parcelas nacidas en el mar generan figuras compuestas con múltiples ejes, por lo que NO PUEDEN tomar un solo eje como argumento.
Marmaduke
73

Tenga en cuenta que si está intentando pasar a un método de "nivel de figura" en seaborn (por ejemplo lmplot, catplot/ factorplot, jointplot) puede y debe especificar esto dentro de los argumentos usando heighty aspect.

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

Consulte https://github.com/mwaskom/seaborn/issues/488 y Plotting with seaborn utilizando la interfaz orientada a objetos matplotlib para obtener más detalles sobre el hecho de que los métodos de nivel de figura no obedecen las especificaciones de los ejes.

elz
fuente
11
Esta es la única respuesta hasta ahora que trata correctamente con tramas sns que no aceptan ax como argumento.
Melissa
Tenga en cuenta que la altura y el aspecto controlan las dimensiones de una sola "faceta", es decir, una subtrama. Por lo tanto, esto no ajusta directamente las dimensiones de la figura completa.
bernie
43

primero importe matplotlib y úselo para establecer el tamaño de la 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)
Gucci148
fuente
20

Esto se puede hacer usando:

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

Esto también funcionará.

from matplotlib import pyplot as plt
import seaborn as sns    

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

Para mi argumento (un diagrama de factor sns) la respuesta propuesta no funcionó bien.

Así uso

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

Justo después de la trama con seaborn (por lo que no es necesario pasar un hacha a seaborn o cambiar la configuración de rc).

cabeza7
fuente
1
Esta es la única solución que me funciona con 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
Igual que aquí. Parece sns.FacetGridque establecería un tamaño de figura de acuerdo con un valor calculado (establecido por heighty aspect) y cambiaría el tamaño de la figura directamente después de que el trazado marino nazca. Y puede ocurrir otro ajuste fino de la trama después de cambiar el tamaño de la figura
Yunting Zhao
16

Además de la respuesta de elz con respecto a los métodos de "nivel de figura" que devuelven objetos de cuadrícula de múltiples gráficos , es posible establecer la altura y el ancho de la figura explícitamente (es decir, sin usar la relación de aspecto) utilizando el siguiente enfoque:

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
fuente
set_figwidthy set_figheightfuncionan bien para objetos de cuadrícula. >>> import seaborn >>> import matplotlib.pyplot como pyplot >>> tips = seaborn.load_dataset ("tips") >>> g = seaborn.FacetGrid (tips, col = "time", row = "fumador") >>> g = g.map (pyplot.hist, "total_bill") >>> g.fig.set_figwidth (10) >>> g.fig.set_figheight (10)
Paul Rougieux
1
Quizás la API cambió, pero para mí fue g.figure.set_figwidth en lugar de g.fig.set_figwidth. Estoy usando matplotlib versión 3.1.0 y seaborn 0.9.0
NateW
6

Las principales respuestas de Paul H y J. Li no funcionan para todo tipo de figuras nacidas en el mar. Para el FacetGridtipo (por ejemplo sns.lmplot()), use el parámetro sizey aspect.

Size cambia tanto la altura como el ancho, manteniendo la relación de aspecto.

Aspect solo cambia el ancho, manteniendo la altura constante.

Siempre puede obtener el tamaño deseado jugando con estos dos parámetros.

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

Chris
fuente