ฉันจะเปลี่ยนขนาดรูปสำหรับพล็อตทะเลได้อย่างไร


223

ฉันจะเปลี่ยนขนาดของภาพเพื่อให้เหมาะสำหรับการพิมพ์ได้อย่างไร

ตัวอย่างเช่นฉันต้องการใช้กับกระดาษ A4 ที่มีขนาด 11.7 นิ้วคูณ 8.27 นิ้วในแนวนอน

คำตอบ:


197

คุณต้องสร้างวัตถุรูป matplotlib และ Axes ก่อนเวลาโดยระบุว่าร่างใหญ่แค่ไหน:

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
วิธีนี้ดูเหมือนจะไม่ทำงานกับรหัสที่ตามมา (พล็อตชนิดต่าง ๆ ) ความคิดใด ๆ ฉันถือว่า "mylib" เป็นเพียงห้องสมุดที่คุณเก็บข้อมูลของคุณและไม่จำเป็นในรหัสนี้: `fig, ax = pyplot.subplots (figsize = (12,6)); sns.jointplot (memoryPrice ['price'], memoryPrice ['Memory']) `
TMWP

3
คำตอบนี้ไม่ทำงานในกรณีของ @ TMWP เพราะข้อต่อเป็นวิธีการวัดระดับ ดูคำตอบด้านล่าง
Elz

5
คำตอบนี้ไม่สามารถใช้ได้กับพล็อตประเภทที่ไม่ยอมรับขวานเป็นอินพุตตัวอย่างเช่นsns.lmplot()
Chris

2
ขนาดพล็อตในทะเลควรตั้งค่าโดยใช้heightและaspectพารามิเตอร์ตามที่อธิบายไว้ที่นี่stackoverflow.com/a/51602446/2412831
LeandroOrdonez

@LeandroOrdonez ที่ใช้ไม่ได้กับฟังก์ชั่นระดับแกน
พอล H

234

คุณสามารถกำหนดขนาดรูปโดยส่งพจนานุกรมไปยังrcพารามิเตอร์ด้วยคีย์'figure.figsize'ในsetวิธีการทางทะเล:

import seaborn as sns

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

ทางเลือกอื่น ๆ อาจจะใช้figure.figsizeของrcParamsขนาดรูปชุดดังต่อไปนี้:

from matplotlib import rcParams

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

รายละเอียดเพิ่มเติมสามารถดูได้ในเอกสารประกอบ matplotlib


5
ไม่เหมือนกับโซลูชันอื่น ๆ โซลูชันนี้ไม่ได้ใช้วิธีกำหนดพล็อต ขอบคุณ
LoMaPh

7
โปรดทราบว่าเมื่อคุณเรียกใช้ sns.set () มันจะใช้รูปแบบรูปแบบของคุณเป็นค่าเริ่มต้นของ sns แทนค่าเริ่มต้นของ matplotlib ตัวอย่างเช่นตัวเลขของคุณจะมีพื้นหลังสีเทาพร้อมกริดสีขาว - ดูที่นี่: seaborn.pydata.org/ กวดวิชา นอกจากนี้สิ่งนี้ไม่มีผลกับขนาดของพล็อตของฉัน (เป็น sns.pairplot)
Melissa

หรือเป็นเหมือน sns.boxplot
Gordon

ขอบคุณสำหรับ @Melissa ทำให้ฉันรู้ว่าฉันต้องโทรหา.set()ก่อน.set_style()
jorijnsmit

89

คุณสามารถตั้งค่าบริบทที่จะเป็นหรือชุดด้วยตนเองposterfig_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')

ป้อนคำอธิบายรูปภาพที่นี่


3
คำตอบนี้ไม่สามารถใช้ได้กับพล็อตประเภทที่ไม่ยอมรับขวานเป็นอินพุตตัวอย่างเช่นsns.lmplot()
Chris

เพื่อขยายคำตอบของคริสแปลงที่ดินบางแห่งสร้างตัวเลขประกอบที่มีหลายแกนดังนั้นพวกเขาจึงไม่สามารถใช้แกนเดี่ยวเป็นอาร์กิวเมนต์ได้
Marmaduke

73

โปรดทราบว่าถ้าคุณกำลังพยายามที่จะผ่านไปยังระดับ "ร่าง" วิธีการในทะเล (ตัวอย่างเช่นlmplot, catplot/ factorplot, jointplot) ที่คุณสามารถและควรระบุข้อโต้แย้งนี้ภายในโดยใช้และheightaspect

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

ดู https://github.com/mwaskom/seaborn/issues/488และการพล็อตกับ seaborn โดยใช้อินเตอร์เฟสเชิงวัตถุ matplotlibสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับข้อเท็จจริงที่ว่าวิธีการระดับรูปไม่ปฏิบัติตามข้อกำหนดของแกน


11
นี่เป็นคำตอบเดียวเท่านั้นที่เกี่ยวข้องกับ sns แปลงที่ไม่ยอมรับขวานเป็นอาร์กิวเมนต์
Melissa

โปรดทราบว่าความสูงและมุมมองจะควบคุมขนาดของ "facet" เช่นแผนย่อย ดังนั้นนี่ไม่ได้ปรับขนาดเต็มรูปแบบโดยตรง
เบอร์

43

matplotlib นำเข้าครั้งแรกและใช้เพื่อกำหนดขนาดของรูป

from matplotlib import pyplot as plt
import seaborn as sns

plt.figure(figsize=(15,8))
ax = sns.barplot(x="Word", y="Frequency", data=boxdata)


19

สิ่งนี้จะทำงานได้เช่นกัน

from matplotlib import pyplot as plt
import seaborn as sns    

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

16

สำหรับพล็อตของฉัน (a sns factorplot) คำตอบที่เสนอนั้นใช้งานไม่ได้

ดังนั้นฉันใช้

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

หลังพล็อตที่มีทะเล (จึงไม่จำเป็นต้องผ่านขวานไปที่ทะเลหรือเพื่อเปลี่ยนการตั้งค่า rc)


1
นี่เป็นทางออกเดียวที่ใช้กับ 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

กันที่นี่ ดูเหมือนว่าsns.FacetGridจะกำหนดขนาดรูปตามค่าที่คำนวณได้ (กำหนดโดยheightและaspect) และการเปลี่ยนขนาดของรูปโดยตรงหลังจากพล็อตทะเลจะทำงาน และการปรับจู
Yunting Zhao

16

นอกจากคำตอบelzเกี่ยวกับวิธีการ "ระดับร่าง" ที่ส่งคืนวัตถุกริดพล็อตแบบหลายจุดก็เป็นไปได้ที่จะกำหนดความสูงและความกว้างของร่างอย่างชัดเจน (นั่นคือโดยไม่ต้องใช้อัตราส่วนภาพ) โดยใช้

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_figwidthและset_figheightทำงานได้ดีสำหรับวัตถุตาราง >>> นำเข้าทะเล >>> นำเข้า matplotlib.pyplot เป็น pyplot >>> เคล็ดลับ = seaborn.load_dataset ("เคล็ดลับ") >>> g = seaborn.FacetGrid (เคล็ดลับ col = "เวลา", แถว = "ผู้สูบบุหรี่") >>> g = g.map (pyplot.hist, "total_bill") >>> g.fig.set_figwidth (10) >>> g.fig.set_figheight (10)
Paul Rougieux

1
บางที API เปลี่ยนไป แต่สำหรับฉันมันคือ g.figure.set_figwidth แทนที่จะเป็น g.fig.set_figwidth ฉันกำลังใช้ matplotlib เวอร์ชั่น 3.1.0 และทะเล 0.9.0
NateW

6

คำตอบที่ดีที่สุดของ Paul H และ J. Li ไม่สามารถใช้ได้กับบุคคลในทะเลทุกประเภท สำหรับFacetGridประเภท (ตัวอย่างsns.lmplot()) ให้ใช้พารามิเตอร์sizeและaspect

Size เปลี่ยนทั้งความสูงและความกว้างโดยคงอัตราส่วนไว้

Aspect เปลี่ยนความกว้างเท่านั้นรักษาความสูงคงที่

คุณสามารถรับขนาดที่คุณต้องการได้ด้วยการเล่นกับพารามิเตอร์ทั้งสองนี้

เครดิต: https://stackoverflow.com/a/28765059/3901029

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.