web-dev-qa-db-ja.com

2つのシーボーンlmplotを並べてプロットする方法は?

サブプロットで2つのディスプロットまたは散布図をプロットするとうまくいきます:

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
import pandas as pd
%matplotlib inline

# create df
x = np.linspace(0, 2 * np.pi, 400)
df = pd.DataFrame({'x': x, 'y': np.sin(x ** 2)})

# Two subplots
f, (ax1, ax2) = plt.subplots(1, 2, sharey=True)
ax1.plot(df.x, df.y)
ax1.set_title('Sharing Y axis')
ax2.scatter(df.x, df.y)

plt.show()

Subplot example

しかし、他のタイプのグラフの代わりにlmplotを使用して同じことを行うと、エラーが発生します。

AttributeError: 'AxesSubplot'オブジェクトには属性 'lmplot'がありません

これらのチャートタイプを並べてプロットする方法はありますか?

15
samthebrand

Matplotlibとそのオブジェクトは完全にseaborn関数を認識していないため、このエラーが発生します。

Axesオブジェクト(つまり、ax1およびax2)を seaborn.regplot に渡すか、それらの定義をスキップして、col kwargの- seaborn.lmplot

同じインポートで、軸を事前定義し、regplotを使用すると次のようになります。

# create df
x = np.linspace(0, 2 * np.pi, 400)
df = pd.DataFrame({'x': x, 'y': np.sin(x ** 2)})
df.index.names = ['obs']
df.columns.names = ['vars']

idx = np.array(df.index.tolist(), dtype='float')  # make an array of x-values

# call regplot on each axes
fig, (ax1, ax2) = plt.subplots(ncols=2, sharey=True)
sns.regplot(x=idx, y=df['x'], ax=ax1)
sns.regplot(x=idx, y=df['y'], ax=ax2)

enter image description here

Lmplotを使用するには、 データフレームを整頓する が必要です。上記のコードから続けて:

tidy = (
    df.stack() # pull the columns into row variables   
      .to_frame() # convert the resulting Series to a DataFrame
      .reset_index() # pull the resulting MultiIndex into the columns
      .rename(columns={0: 'val'}) # rename the unnamed column
)
sns.lmplot(x='obs', y='val', col='vars', hue='vars', data=tidy)

enter image description here

33
Paul H