Seaborn lmplotfacetgridでxlimとylimを設定する方法


87

Seabornのlmplotを使用して線形回帰をプロットし、データセットをカテゴリ変数を使用して2つのグループに分割しています。

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,)

ここに画像の説明を入力してください

FacetGridの各プロットのxlimとylimにアクセスするにはどうすればよいですか?


4
ちなみに、numpy.randomモジュールに慣れていると、ランダムデータを生成する時間を大幅に節約できます(これは非常に便利なことです!)。たとえば、あなたが得ることができるbase_xbase_yしてbase_x = np.random.rand(n); base_y = base_x * 2y変数は、その後、同様にベクトル化操作で生成することができます。
mwaskom 2014

回答:


146

このlmplot関数はFacetGridインスタンスを返します。このオブジェクトには、と呼ばれるメソッドがあり、ペアをset渡すことができkey=value、それらはグリッド内の各Axesオブジェクトに設定されます。

次に、Noneデフォルトのままにしておきたい値を渡すことで、matplotlibで軸制限の片側のみを設定できます。

これらをまとめると、次のようになります。

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

ここに画像の説明を入力してください


4
おっと、それは簡単です。ドキュメントを見ると、g.setサブプロットごとに変更されているようです。g.axesは、それぞれを個別に設定するための推奨される方法にアプローチしていますか?
exp1orer 2014

6
はい、ファセットの1つ(またはすべてではありません)にいくつかのプロパティを設定したい場合g.axesは、DrVが示唆するように、配列を使用する必要があります。
mwaskom 2014

1
これは受け入れられた答えでなければなりません。5年後、それはまだ機能し、受け入れられた答えよりも効率的です。
bbennett 3619

81

軸自体を把握する必要があります。おそらく最もクリーンな方法は、最後の行を変更することです。

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

次に、Axesオブジェクト(軸の配列)を取得できます。

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.