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

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)

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


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í


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.


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)

20

Esto se puede hacer usando:

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

19

Esto también funcionará.

from matplotlib import pyplot as plt
import seaborn as sns    

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

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


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)

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.