Bagaimana cara mengubah ukuran gambar untuk plot seaborn?

223

Bagaimana cara mengubah ukuran gambar saya sehingga cocok untuk dicetak?

Sebagai contoh, saya ingin menggunakan kertas A4, yang dimensi 11,7 inci kali 8,27 inci dalam orientasi lanskap.

Michael Grazebrook
sumber

Jawaban:

196

Anda harus membuat objek Gambar dan Sumbu matplotlib sebelumnya, menentukan seberapa besar angka tersebut:

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.
sumber
7
solusi ini sepertinya tidak bekerja dengan kode yang mengikuti (jenis plot yang berbeda). Ada ide? Saya berasumsi "mylib" hanyalah pustaka tempat Anda menyimpan data Anda dan tidak diperlukan dalam kode ini: `fig, ax = pyplot.subplots (figsize = (12,6)); sns.jointplot (memoryPrice ['price'], memoryPrice ['Memory']) `
TMWP
3
Jawaban ini tidak berfungsi dalam kasus @ TMWP karena jointplot adalah metode tingkat angka. Lihat jawaban di bawah ini.
elz
5
jawaban ini tidak berfungsi dengan tipe plot yang tidak menerima kapak sebagai input, misalnyasns.lmplot()
Chris
2
Ukuran plot di seaborn harus ditetapkan menggunakan parameter heightdan aspectseperti yang dijelaskan di sini stackoverflow.com/a/51602446/2412831
LeandroOrdonez
@LeandroOrdonez yang tidak benar-benar berlaku untuk fungsi level sumbu.
Paul H
234

Anda juga dapat mengatur ukuran gambar dengan meneruskan kamus ke rcparameter dengan metode 'figure.figsize'seaborn set:

import seaborn as sns

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

Alternatif lain mungkin menggunakan figure.figsizedari rcParamsukuran gambar set seperti di bawah ini:

from matplotlib import rcParams

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

Rincian lebih lanjut dapat ditemukan di dokumentasi matplotlib

siswa
sumber
5
Tidak seperti solusi lain, solusi ini tidak mengasumsikan cara tertentu untuk mendefinisikan plot. Terima kasih.
LoMaPh
6
Perhatikan bahwa ketika Anda memanggil sns.set (), default gaya gambar Anda ke default sns alih-alih standar matplotlib, misalnya angka Anda kemudian akan tiba-tiba memiliki latar belakang abu-abu dengan kotak putih - lihat di sini: seaborn.pydata.org/ tutorial / aesthetics.html . Juga, ini tidak berpengaruh pada ukuran plot saya (a sns.pairplot).
Melissa
Maupun milikku sebagai sns.boxplot
Gordon
Terima kasih untuk @Melissa. Ini membuat saya sadar bahwa saya harus menelepon .set()sebelumnya.set_style()
jorijnsmit
89

Anda dapat mengatur konteks menjadi posteratau diatur secara manual 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')

masukkan deskripsi gambar di sini

Jianxun Li
sumber
3
jawaban ini tidak berfungsi dengan tipe plot yang tidak menerima kapak sebagai input, misalnyasns.lmplot()
Chris
Untuk memperluas jawaban Chris, beberapa plot seaborn menghasilkan angka komposit dengan banyak sumbu, sehingga mereka TIDAK BISA mengambil sumbu tunggal sebagai argumen.
Marmaduke
73

Perhatikan bahwa jika Anda mencoba meneruskan ke metode "angka tingkat" di seaborn (misalnya lmplot, catplot/ factorplot, jointplot) Anda bisa dan harus menentukan ini dalam argumen menggunakan heightdan aspect.

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

Lihat https://github.com/mwaskom/seaborn/issues/488 dan Merencanakan dengan seaborn menggunakan antarmuka berorientasi objek matplotlib untuk detail lebih lanjut tentang fakta bahwa metode level figur tidak mematuhi spesifikasi sumbu.

elz
sumber
11
Ini adalah satu-satunya jawaban sejauh ini yang benar menangani plot sns yang tidak menerima kapak sebagai argumen.
Melissa
Perhatikan bahwa ketinggian dan aspek mengontrol dimensi satu "sisi", yaitu subplot. Jadi ini tidak secara langsung menyesuaikan dimensi angka penuh.
bernie
43

pertama impor matplotlib dan gunakan untuk mengatur ukuran gambar

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
sumber
20

Ini dapat dilakukan dengan menggunakan:

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

Ini juga akan berfungsi.

from matplotlib import pyplot as plt
import seaborn as sns    

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

Untuk plot saya (a sns factorplot) jawaban yang diajukan tidak berfungsi dengan baik.

Jadi saya gunakan

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

Tepat setelah plot dengan seaborn (jadi tidak perlu melewatkan kapak ke seaborn atau mengubah pengaturan rc).

kepala7
sumber
1
Ini adalah satu-satunya solusi yang bekerja untuk saya dengan 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
Sama disini. Sepertinya sns.FacetGridakan mengatur ukuran gambar sesuai dengan nilai yang dihitung (ditetapkan oleh heightdan aspect) dan mengubah ukuran gambar langsung setelah plot seaborn akan bekerja. Dan penyempurnaan plot lainnya dapat terjadi setelah mengubah ukuran gambar
Yunting Zhao
16

Selain jawaban elz mengenai metode "angka", yang mengembalikan objek kotak multi-plot dimungkinkan untuk mengatur tinggi dan lebar angka secara eksplisit (tanpa menggunakan aspek rasio) menggunakan pendekatan berikut:

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
sumber
set_figwidthdan set_figheightbekerja dengan baik untuk objek grid. >>> impor seaborn >>> impor matplotlib.pyplot sebagai pyplot >>> tips = seaborn.load_dataset ("tips") >>> g = seaborn.FacetGrid (kiat, col = "waktu", baris = "perokok") >>> g = g.map (pyplot.hist, "total_bill") >>> g.fig.set_figwidth (10) >>> g.fig.set_figheight (10)
Paul Rougieux
1
Mungkin API berubah, tetapi bagi saya itu adalah g.figure.set_figwidth alih-alih g.fig.set_figwidth. Saya menggunakan matplotlib versi 3.1.0 dan seaborn 0.9.0
NateW
6

Jawaban teratas oleh Paul H dan J. Li tidak bekerja untuk semua jenis tokoh seaborn. Untuk FacetGridtipe (misalnya sns.lmplot()), gunakan parameter sizedan aspect.

Size mengubah ketinggian dan lebar, mempertahankan rasio aspek.

Aspect hanya mengubah lebar, menjaga ketinggian konstan.

Anda selalu bisa mendapatkan ukuran yang diinginkan dengan bermain dengan dua parameter ini.

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

Chris
sumber