Como altero o tamanho da figura para uma plotagem marítima?

223

Como altero o tamanho da minha imagem para que ela seja adequada para impressão?

Por exemplo, eu gostaria de usar papel A4, cujas dimensões são 11,7 polegadas por 8,27 polegadas na orientação paisagem.

Michael Grazebrook
fonte

Respostas:

196

Você precisa criar os objetos Matplotlib Figure e Axes antes do tempo, especificando o tamanho da 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
fonte
7
essa solução parece não funcionar com o código a seguir (tipo diferente de plot). Alguma ideia? Presumo que "mylib" seja apenas uma biblioteca onde você armazenou seus dados e não é necessário neste código: `fig, ax = pyplot.subplots (figsize = (12,6)); sns.jointplot (memoryPrice ['preço'], memoryPrice ['Memory']) '
#
3
Esta resposta não funciona no caso do @ TMWP, porque jointplot é um método em nível de figura. Veja a resposta abaixo.
Elz
5
esta resposta não funciona com esses tipos de gráficos que não aceitam machado como uma entrada, por exemplosns.lmplot()
Chris
2
Terreno em Seaborn deve ser definida usando os heighte aspectparâmetros como explicado aqui stackoverflow.com/a/51602446/2412831
LeandroOrdonez
@LeandroOrdonez que não é realmente aplicável à função no nível de eixos.
Paul H
234

Você também pode definir o tamanho da figura passando o dicionário para o rcparâmetro com a tecla 'figure.figsize'no setmétodo marítimo :

import seaborn as sns

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

Outra alternativa pode ser a utilização figure.figsizede rcParamsao tamanho figura conjunto como a seguir:

from matplotlib import rcParams

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

Mais detalhes podem ser encontrados na documentação do matplotlib

aluna
fonte
5
Diferente de outras soluções, essa solução não assume uma certa maneira de definir o gráfico. Obrigado.
LoMaPh 9/09/18
6
Observe que, quando você chama sns.set (), o padrão é o estilo de figura para o padrão sns, em vez do padrão matplotlib; por exemplo, suas figuras repentinamente terão um fundo cinza com grade branca - veja aqui: seaborn.pydata.org/ tutorial / aesthetics.html . Além disso, isso não afetou o tamanho do meu gráfico (um sns.pairplot).
Melissa
Nem o meu como um sns.boxplot
Gordon
Obrigado por isso @Melissa. Isso me fez perceber que eu tinha que ligar .set()antes.set_style()
jorijnsmit 16/04
89

Você pode definir o contexto para ser posterou definir 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')

insira a descrição da imagem aqui

Jianxun Li
fonte
3
esta resposta não funciona com esses tipos de gráficos que não aceitam machado como uma entrada, por exemplosns.lmplot()
Chris
Para expandir a resposta de Chris, alguns gráficos marítimos geram figuras compostas com múltiplos eixos, portanto, eles não podem usar um único eixo como argumento.
Marmaduke #
73

Observe que se você estiver tentando passar para um método de "nível de figura" no mar (por exemplo lmplot, catplot/ factorplot, jointplot) , poderá e deve especificar isso nos argumentos usando heighte 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 e Plotagem com seaborn usando a interface orientada a objetos matplotlib para obter mais detalhes sobre o fato de que os métodos no nível de figura não obedecem às especificações dos eixos.

elz
fonte
11
Até agora, esta é a única resposta que lida corretamente com gráficos de sns que não aceitam ax como argumento.
Melissa
Observe que a altura e o aspecto controlam as dimensões de uma única "faceta", isto é, uma subparcela. Portanto, isso não ajusta diretamente as dimensões completas da figura.
bernie 22/01
43

primeiro importe o matplotlib e use-o para definir o tamanho da 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
fonte
20

Isso pode ser feito usando:

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

Isso também deve funcionar.

from matplotlib import pyplot as plt
import seaborn as sns    

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

Para o meu gráfico (um sns factorplot), a resposta proposta não funcionou bem.

Então eu uso

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

Logo após a trama com o mar (portanto, não há necessidade de passar um machado para o mar ou alterar as configurações de rc).

head7
fonte
1
Esta é a única solução que funciona para mim com um 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
O mesmo aqui. Parece sns.FacetGridque definiria um tamanho de figura de acordo com um valor calculado (definido por heighte aspect) e a alteração do tamanho de figura diretamente após o funcionamento da plotagem por via marítima. E outro ajuste fino do enredo pode acontecer depois de alterar o tamanho da figura
Yunting Zhao
16

Além da resposta elz referente aos métodos "nível de figura" que retornam objetos de grade com vários gráficos , é possível definir a altura e a largura da figura explicitamente (ou seja, sem usar a proporção) usando a seguinte abordagem:

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
fonte
set_figwidthe set_figheightfunciona bem para objetos de grade. >>> importar seaborn >>> importar matplotlib.pyplot como pyplot >>> dicas = seaborn.load_dataset ("dicas") >>> g = seaborn.FacetGrid (dicas, col = "hora", linha = "fumante") >>> g = g.map (pyplot.hist, "total_bill") >>> g.fig.set_figwidth (10) >>> g.fig.set_figheight (10)
Paul Rougieux
1
Talvez a API tenha mudado, mas para mim foi g.figure.set_figwidth em vez de g.fig.set_figwidth. Estou usando o matplotlib versão 3.1.0 e seaborn 0.9.0
NateW 23/01
6

As principais respostas de Paul H e J. Li não funcionam para todos os tipos de figuras marítimas. Para o FacetGridtipo (por exemplo sns.lmplot()), use o parâmetro sizee aspect.

Size altera a altura e a largura, mantendo a proporção.

Aspect apenas altera a largura, mantendo a altura constante.

Você sempre pode obter o tamanho desejado jogando com esses dois parâmetros.

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

Chris
fonte