Як встановити деякі xlim та ylim у сітці Seaborn lmplot


85

Я використовую 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з base_x = np.random.rand(n); base_y = base_x * 2. Потім yзмінну можна генерувати аналогічним чином за допомогою векторизованих операцій.
mwaskom

Відповіді:


143

lmplotФункція повертає FacetGridекземпляр. Цей об'єкт має метод, що викликається set, до якого ви можете передати key=valueпари, і вони будуть встановлені для кожного об'єкта Axes у сітці.

По-друге, ви можете встановити лише одну сторону обмеження осей у matplotlib, передавши Noneзначення, яке потрібно залишити за замовчуванням.

Склавши їх разом, ми маємо:

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

введіть тут опис зображення


4
Ого, це просто. Заглядаючи в документи, здається, g.setзмінюється кожна підзаголовка. Чи наближаються g.ax для рекомендованого способу встановлення кожного з них окремо?
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,)

створює:

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.