web-dev-qa-db-ja.com

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

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)

これにより、次が出力されます。 enter image description here

しかし、この例では、xlimとylimを(0、*)にしたいです。 sns.plt.ylimとsns.plt.xlimを使用してみましたが、これらは右側のプロットにのみ影響します。例:

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

enter image description here

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

68
exp1orer

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

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

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

axes = lm.axes

その後、軸のプロパティを調整できます

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

作成:

enter image description here

63
DrV

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

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

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

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

enter image description here

115
mwaskom