Làm cách nào để thay đổi kích thước hình cho một lô biển?


223

Làm cách nào để thay đổi kích thước hình ảnh của tôi để nó phù hợp để in?

Ví dụ: tôi muốn sử dụng giấy A4, có kích thước 11,7 inch x 8,27 inch theo hướng ngang.

Câu trả lời:


196

Bạn cần tạo các đối tượng Hình và Trục của matplotlib trước thời hạn, chỉ định hình lớn như thế nào:

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
giải pháp này dường như không hoạt động với mã theo sau (loại cốt truyện khác nhau). Có ý kiến ​​gì không? Tôi giả sử "mylib" chỉ là một thư viện nơi bạn lưu trữ dữ liệu của mình và không cần thiết trong mã này: `fig, ax = pyplot.subplots (figsize = (12,6)); sns.jointplot (memoryprice ['price'], memoryprice ['Memory']) `
TMWP

3
Câu trả lời này không hoạt động trong trường hợp của @ TMWP bởi vì khớp là một phương pháp mức hình. Xem câu trả lời dưới đây.
elz

5
câu trả lời này không hoạt động với các loại cốt truyện không chấp nhận ax làm đầu vào, ví dụsns.lmplot()
Chris

2
Kích thước lô trong seaborn nên được đặt bằng cách sử dụng heightaspectcác tham số như được giải thích ở đây stackoverflow.com/a/51602446/2412831
LeandroOrdonez

@LeandroOrdonez không thực sự áp dụng cho chức năng cấp trục.
Paul H

233

Bạn cũng có thể đặt kích thước hình bằng cách chuyển từ điển sang rctham số bằng khóa 'figure.figsize'trong setphương thức seaborn :

import seaborn as sns

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

Thay thế khác có thể sử dụng figure.figsizecác rcParamskích thước hình thiết lập như sau:

from matplotlib import rcParams

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

Thông tin chi tiết có thể được tìm thấy trong tài liệu matplotlib


5
Không giống như các giải pháp khác, giải pháp này không giả định một cách xác định cốt truyện nhất định. Cảm ơn.
LoMaPh

6
Lưu ý rằng khi bạn gọi sns.set (), nó mặc định các kiểu hình của bạn thành mặc định sns thay vì mặc định matplotlib, ví dụ như các số liệu của bạn sẽ đột nhiên có nền màu xám với lưới màu trắng - xem tại đây: seaborn.pydata.org/ hướng dẫn / thẩm mỹ.html . Ngoài ra, điều này không có bất kỳ ảnh hưởng nào đến kích thước của cốt truyện của tôi (một sns.pairplot).
Melissa

Tôi cũng không phải là sns.boxplot
Gordon

Cảm ơn vì điều đó @Melissa. Điều này khiến tôi nhận ra mình phải gọi .set()trước.set_style()
jorijnsmit

89

Bạn có thể đặt bối cảnh thành posterhoặc đặt thủ công 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')

nhập mô tả hình ảnh ở đây


3
câu trả lời này không hoạt động với các loại cốt truyện không chấp nhận ax làm đầu vào, ví dụsns.lmplot()
Chris

Để mở rộng câu trả lời của Chris, một số lô đất sinh ra các hình tổng hợp có nhiều trục, vì vậy chúng KHÔNG thể lấy một trục đơn làm đối số.
Marmaduke

73

Lưu ý rằng nếu bạn đang cố gắng để vượt qua một phương pháp "cấp con số" trong sanh ở biển (ví dụ lmplot, catplot/ factorplot, jointplot), bạn có thể và nên xác định này trong đối số sử dụng heightaspect.

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

Xem https://github.com/mwaskom/seaborn/issues/488Vẽ sơ đồ với seaborn bằng giao diện hướng đối tượng matplotlib để biết thêm chi tiết về thực tế rằng các phương pháp mức hình không tuân theo thông số kỹ thuật trục.


11
Đây là câu trả lời duy nhất cho đến nay giải quyết chính xác các lô sns không chấp nhận ax như một đối số.
Melissa

Lưu ý rằng chiều cao và khía cạnh kiểm soát kích thước của một "khía cạnh" duy nhất, tức là một ô phụ. Vì vậy, điều này không trực tiếp điều chỉnh kích thước hình đầy đủ.
bernie

43

nhập matplotlib đầu tiên và sử dụng nó để đặt kích thước của hình

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

Điều này có thể được thực hiện bằng cách sử dụng:

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

19

Điều này cũng sẽ làm việc.

from matplotlib import pyplot as plt
import seaborn as sns    

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

16

Đối với âm mưu của tôi (một nhân tố sns), câu trả lời được đề xuất không hoạt động tốt.

Vì vậy tôi sử dụng

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

Ngay sau cốt truyện với seaborn (vì vậy không cần phải chuyển rìu sang seaborn hoặc thay đổi cài đặt RC).


1
Đây là giải pháp duy nhất phù hợp với tôi với 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

Tương tự ở đây. Có vẻ như sns.FacetGridsẽ đặt kích thước hình theo giá trị được tính (được đặt bởi heightaspect) và thay đổi kích thước hình trực tiếp sau khi vẽ sơ đồ đáy biển sẽ hoạt động. Và điều chỉnh tốt khác của cốt truyện có thể xảy ra sau khi thay đổi kích thước hình
Yunting Zhao

16

Ngoài câu trả lời của elz về các phương thức "mức hình" trả về các đối tượng lưới nhiều ô, có thể đặt rõ ràng chiều cao và chiều rộng của hình (không sử dụng tỷ lệ khung hình) bằng cách sử dụng phương pháp sau:

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_figwidthset_figheightlàm việc tốt cho các đối tượng lưới. >>> nhập seaborn >>> nhập matplotlib.pyplot dưới dạng pyplot >>> tips = seaborn.load_dataset ("mẹo") >>> g = seaborn.FacetGrid (mẹo, col = "time", row = "smoker") >>> g = g.map (pyplot.hist, "Total_bill") >>> g.fig.set_figference (10) >>> g.fig.set_figheight (10)
Paul Rougieux

1
Có lẽ API đã thay đổi, nhưng đối với tôi, đó là g.figure.set_figference thay vì g.fig.set_figference. Tôi đang sử dụng matplotlib phiên bản 3.1.0 và seaborn 0.9.0
NateW

6

Các câu trả lời hàng đầu của Paul H và J. Li không hoạt động cho tất cả các loại hình người đi biển. Đối với FacetGridloại (ví dụ sns.lmplot()), sử dụng tham số sizeaspect.

Size thay đổi cả chiều cao và chiều rộng, duy trì tỷ lệ khung hình.

Aspect chỉ thay đổi chiều rộng, giữ chiều cao không đổi.

Bạn luôn có thể có được kích thước mong muốn của mình bằng cách chơi với hai tham số này.

Tín dụng: https://stackoverflow.com/a/28765059/3901029

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.