[英]python: distplot with multiple distributions
我正在使用 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 個圖。
有誰知道我是怎么做到的?
謝謝。
重要的是按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)
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()
解決此類問題的一種更常見的方法是使用melt 將數據重新轉換為長格式,然后讓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))
我發現用簡單的解決方案FacetGrid上https://github.com/mwaskom/seaborn/issues/861通過citynorman:
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'])
g = sns.FacetGrid(iris, hue="target")
g = g.map(sns.distplot, "sepal length (cm)", hist=False, rug=True)
任何試圖使用新的 0.11.0 版本構建相同繪圖的人,Seaborn 已經或正在棄用 distplot 並將其替換為 displot。
所以新版本明智的代碼是:
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'])
sns.displot(data=iris, x='sepal length (cm)', hue='target', kind='kde', fill=True, palette=sns.color_palette('bright')[:3], height=5, aspect=1.5)
如果有人想在 seaborn 中獲得 distplots 或直方圖的 facetgrid,新的sns.displot函數內置了 facetgrid! 如果您先融化 iris 數據框,這將非常容易使用。
在@Abbas 和@Amit Amola 之前的答案中構建和更新代碼:
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'])
iris['target'] = iris['target'].astype(str)
iris_melt = iris.melt(id_vars='target')
iris_melt.head()
target variable value
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
sns.displot(
data=iris_melt,
x='value',
hue='target',
kind='kde',
fill=True,
col='variable'
)
這里的圖像很小,但是如果您右鍵單擊圖像並在新選項卡或窗口中打開它,您可以更好地看到細節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.