Как установить некоторые xlim и ylim в фасетной сетке Seaborn lmplot

87

Я использую lmplot Сиборна для построения линейной регрессии, разделив мой набор данных на две группы с помощью категориальной переменной.

И для 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?

эксп1орер
источник
4
Кстати, если вы ознакомитесь с numpy.randomмодулем, вы сможете сэкономить много времени на генерации случайных данных (что может быть очень полезным делом!). Например, вы могли получить base_xи base_yс base_x = np.random.rand(n); base_y = base_x * 2. Затем yпеременная может быть сгенерирована аналогичным образом с помощью векторизованных операций.
mwaskom 08

Ответы:

146

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.axes к рекомендуемому способу установки каждого из них отдельно?
exp1orer 08
6
Да, если вы хотите установить какое-либо свойство для одного (или нескольких, но не всех) аспектов, вам следует использовать g.axesмассив, как предлагает DrV.
mwaskom 08
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,)

создает:

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

DrV
источник