วิธีตั้งค่า xlim และ ylim ใน Seaborn lmplot facetgrid


87

ฉันใช้ lmplot ของ Seaborn ในการพล็อตการถดถอยเชิงเส้นโดยแบ่งชุดข้อมูลของฉันออกเป็นสองกลุ่มด้วยตัวแปรเด็ดขาด

สำหรับทั้ง x และ y ฉันต้องการตั้งค่าขอบเขตล่างของทั้งสองแปลงด้วยตนเองแต่ปล่อยขอบเขตบนไว้ที่ค่าเริ่มต้นของ Seaborn นี่คือตัวอย่างง่ายๆ:

import pandas as pd
import seaborn as sns
import random

n = 200
random.seed(2014)
base_x = [random.random() for i in range(n)]
base_y = [2*i for i in base_x]
errors = [random.uniform(0,1) for i in range(n)]
y = [i+j for i,j in zip(base_y,errors)]

df = pd.DataFrame({'X': base_x,
                   'Y': y,
                   'Z': ['A','B']*(n/2)})

mask_for_b = df.Z == 'B'
df.loc[mask_for_b,['X','Y']] = df.loc[mask_for_b,] *2

sns.lmplot('X','Y',df,col='Z',sharex=False,sharey=False)

ผลลัพธ์ต่อไปนี้: ใส่คำอธิบายภาพที่นี่

แต่ในตัวอย่างนี้ฉันต้องการให้ xlim และ ylim เป็น (0, *) ฉันลองใช้ sns.plt.ylim และ sns.plt.xlim แต่สิ่งเหล่านี้มีผลต่อพล็อตด้านขวาเท่านั้น ตัวอย่าง:

sns.plt.ylim(0,)
sns.plt.xlim(0,)

ใส่คำอธิบายภาพที่นี่

ฉันจะเข้าถึง xlim และ ylim สำหรับแต่ละพล็อตใน FacetGrid ได้อย่างไร


4
อย่างไรก็ตามหากคุณคุ้นเคยกับnumpy.randomโมดูลนี้คุณสามารถประหยัดเวลาในการสร้างข้อมูลแบบสุ่มได้มาก (ซึ่งอาจเป็นสิ่งที่มีประโยชน์มากที่จะทำ!) ตัวอย่างเช่นคุณอาจจะได้รับbase_xและมีbase_y ตัวแปรนั้นจะสามารถสร้างขึ้นในทำนองเดียวกันกับการดำเนินงาน vectorized base_x = np.random.rand(n); base_y = base_x * 2y
mwaskom

คำตอบ:


146

lmplotฟังก์ชันส่งกลับFacetGridอินสแตนซ์ วัตถุนี้มีวิธีการที่เรียกว่าsetซึ่งคุณสามารถส่งผ่านได้key=valueคู่และจะถูกตั้งค่าบนวัตถุแต่ละแกนในตาราง

ประการที่สองคุณสามารถตั้งค่าขีด จำกัด แกนเพียงด้านเดียวใน matplotlib โดยส่งผ่านNoneค่าที่คุณต้องการให้เป็นค่าเริ่มต้น

เมื่อรวมสิ่งเหล่านี้เข้าด้วยกันเรามี:

g = sns.lmplot('X', 'Y', df, col='Z', sharex=False, sharey=False)
g.set(ylim=(0, None))

ใส่คำอธิบายภาพที่นี่


4
โอ้โฮมันง่ายมาก เมื่อดูในเอกสารดูเหมือนว่าจะg.setเปลี่ยนทุกเรื่องย่อย g.axes เข้าใกล้วิธีที่แนะนำในการตั้งค่าแต่ละตัวแยกกันหรือไม่?
exp1orer

6
ใช่ถ้าคุณต้องการตั้งค่าคุณสมบัติบางอย่างในแง่หนึ่ง (หรือมากกว่า แต่ไม่ใช่ทั้งหมด) ของแง่มุมคุณควรใช้g.axesอาร์เรย์ตามที่ DrV แนะนำ
mwaskom

1
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ 5 ปีต่อมาและยังคงใช้งานได้และมีประสิทธิภาพมากกว่าคำตอบที่ยอมรับ
bbennett36

81

คุณต้องจับแกนเอง วิธีที่สะอาดที่สุดคือการเปลี่ยนแถวสุดท้ายของคุณ:

lm = sns.lmplot('X','Y',df,col='Z',sharex=False,sharey=False)

จากนั้นคุณสามารถยึดวัตถุแกน (อาร์เรย์ของแกน):

axes = lm.axes

หลังจากนั้นคุณสามารถปรับแต่งคุณสมบัติแกน

axes[0,0].set_ylim(0,)
axes[0,1].set_ylim(0,)

สร้าง:

ใส่คำอธิบายภาพที่นี่

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