Seabornを使用して分布プロットをプロットしています。同じプロット上に複数の分布を異なる色でプロットしたいと思います。
分布プロットを開始する方法は次のとおりです。
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
iris = pd.DataFrame(data= np.c_[iris['data'], iris['target']],columns= iris['feature_names'] + ['target'])
sns.distplot(iris[['sepal length (cm)']], hist=False, rug=True);
「ターゲット」列には3つの値、0、1、2が含まれます。
ターゲット== 0、ターゲット== 1、ターゲット== 2の合計が3つのプロットであるがく片の長さの1つの分布プロットを見たいと思います。
誰が私がそれを行う方法を知っていますか?
ありがとうございました。
重要なことは、target
が0
、1
、または2
である値でデータフレームをソートすることです。
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
import seaborn as sns
iris = load_iris()
iris = pd.DataFrame(data=np.c_[iris['data'], iris['target']],
columns=iris['feature_names'] + ['target'])
# Sort the dataframe by target
target_0 = iris.loc[iris['target'] == 0]
target_1 = iris.loc[iris['target'] == 1]
target_2 = iris.loc[iris['target'] == 2]
sns.distplot(target_0[['sepal length (cm)']], hist=False, rug=True)
sns.distplot(target_1[['sepal length (cm)']], hist=False, rug=True)
sns.distplot(target_2[['sepal length (cm)']], hist=False, rug=True)
sns.plt.show()
出力は次のようになります。
target
の値の数がわからない場合は、target
列で一意の値を見つけてから、データフレームをスライスし、適切にプロットに追加します。
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
import seaborn as sns
iris = load_iris()
iris = pd.DataFrame(data=np.c_[iris['data'], iris['target']],
columns=iris['feature_names'] + ['target'])
unique_vals = iris['target'].unique() # [0, 1, 2]
# Sort the dataframe by target
# Use a list comprehension to create list of sliced dataframes
targets = [iris.loc[iris['target'] == val] for val in unique_vals]
# Iterate through list and plot the sliced dataframe
for target in targets:
sns.distplot(target[['sepal length (cm)']], hist=False, rug=True)
sns.plt.show()
このタイプの問題に対するより一般的なアプローチは、メルトを使用してデータを長い形式に再キャストし、残りはmapに任せることです。
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
import seaborn as sns
iris = load_iris()
iris = pd.DataFrame(data=np.c_[iris['data'], iris['target']],
columns=iris['feature_names'] + ['target'])
# recast into long format
df = iris.melt(['target'], var_name='cols', value_name='vals')
df.head()
target cols vals
0 0.0 sepal length (cm) 5.1
1 0.0 sepal length (cm) 4.9
2 0.0 sepal length (cm) 4.7
3 0.0 sepal length (cm) 4.6
4 0.0 sepal length (cm) 5.0
FacetGridを作成し、マップを使用するだけでプロットできるようになりました。
g = sns.FacetGrid(df, col='cols', hue="target", palette="Set1")
g = (g.map(sns.distplot, "vals", hist=False, rug=True))