python:具有多个发行版的distplot

时间:2017-09-05 01:19:11

标签: python seaborn

我正在使用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);

'target'列包含3个值:0,1,2。

我想看一个萼片长度的分布图,其中目标== 0,目标== 1,目标== 2,总共3个图。

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

谢谢。

6 个答案:

答案 0 :(得分:26)

重要的是按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)

sns.plt.show()

输出如下:

enter image description here

如果您不知道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()

答案 1 :(得分:18)

针对此类问题的一种更常见的方法是使用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并使用map:

即可进行绘图
g = sns.FacetGrid(df, col='cols', hue="target", palette="Set1")
g = (g.map(sns.distplot, "vals", hist=False, rug=True))

enter image description here

答案 2 :(得分:8)

我发现 citynorman FacetGrid上使用https://github.com/mwaskom/seaborn/issues/861可以找到一个更简单的解决方案:

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)

enter image description here

答案 3 :(得分:3)

更新和更简单的选项:

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

enter image description here

答案 4 :(得分:0)

任何尝试使用新的0.11.0版本构建相同图的人,Seaborn都会或正在不赞成使用distplot并将其替换为displot。

因此,新版本的代码应该是:

=INDEX(SPLIT(SUBSTITUTE(A1:A,"x"," and "),"_"),0,3)

enter image description here

答案 5 :(得分:0)

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

这里的图片很小,但是如果您右键单击图片并在新标签页或窗口中打开它,您可以更好地看到细节。

enter image description here