簡體   English   中英

python:具有多個分布的distplot

[英]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 個圖。

有誰知道我是怎么做到的?

謝謝。

重要的是按target012值對數據框進行排序。

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

在此處輸入圖片說明

我發現用簡單的解決方案FacetGridhttps://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)

在此處輸入圖片說明

一個更新和更簡單的選項:

sns.displot(data=iris, x='sepal length (cm)', hue='target', kind='kde')

在此處輸入圖片說明

如果有人想在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM