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.

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)

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


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


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.


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)

20

Ini dapat dilakukan dengan menggunakan:

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

19

Ini juga akan berfungsi.

from matplotlib import pyplot as plt
import seaborn as sns    

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

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


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)

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.