Cách thiết lập một số xlim và ylim trong Seaborn lmplot facetgrid


85

Tôi đang sử dụng lmplot của Seaborn để vẽ một hồi quy tuyến tính, chia tập dữ liệu của tôi thành hai nhóm với một biến phân loại.

Đối với cả x và y, tôi muốn đặt giới hạn dưới theo cách thủ công trên cả hai lô, nhưng để giới hạn trên ở mặc định Seaborn. Đây là một ví dụ đơn giản:

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)

Điều này xuất hiện như sau: nhập mô tả hình ảnh ở đây

Nhưng trong ví dụ này, tôi muốn xlim và ylim là (0, *). Tôi đã thử sử dụng sns.plt.ylim và sns.plt.xlim nhưng những thứ đó chỉ ảnh hưởng đến cốt truyện bên phải. Thí dụ:

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

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

Làm cách nào tôi có thể truy cập xlim và ylim cho từng ô trong FacetGrid?


4
Nhân tiện, nếu bạn đã làm quen với numpy.randommô-đun, bạn có thể tiết kiệm cho mình rất nhiều thời gian tạo ra dữ liệu ngẫu nhiên (đây có thể là một việc rất hữu ích để làm!). Ví dụ, bạn có thể lấy base_xbase_yvới base_x = np.random.rand(n); base_y = base_x * 2. Sau đó, ybiến có thể được tạo tương tự với các hoạt động được vector hóa.
mwaskom

Câu trả lời:


143

Các lmplotchức năng trả về một FacetGridví dụ. Đối tượng này có một phương thức được gọi set, mà bạn có thể chuyển key=valuecác cặp và chúng sẽ được đặt trên mỗi đối tượng Axes trong lưới.

Thứ hai, bạn chỉ có thể đặt một mặt của giới hạn Axes trong matplotlib bằng cách chuyển Nonecho giá trị bạn muốn giữ nguyên làm giá trị mặc định.

Kết hợp những thứ này lại với nhau, chúng ta có:

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

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


4
Ồ, thật dễ dàng. Nhìn vào tài liệu, có vẻ như g.setmọi ô con đều thay đổi. Phương pháp tiếp cận g.axes có phải là cách được khuyến nghị để đặt từng thứ riêng biệt không?
exp1orer

6
Đúng vậy, nếu bạn muốn đặt một số thuộc tính trên một (hoặc nhiều, nhưng không phải tất cả) thuộc tính thì bạn nên sử dụng g.axesmảng, như DrV gợi ý.
mwaskom

1
Đây phải là câu trả lời được chấp nhận. 5 năm sau và nó vẫn hoạt động và hiệu quả hơn câu trả lời được chấp nhận.
bbennett36

81

Bạn cần phải nắm được các trục của chính nó. Có lẽ cách tốt nhất là thay đổi hàng cuối cùng của bạn:

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

Sau đó, bạn có thể nắm giữ các đối tượng trục (một mảng các trục):

axes = lm.axes

Sau đó, bạn có thể điều chỉnh các thuộc tính của trục

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

tạo ra:

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

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.