我正在使用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个图。
有谁知道我是怎么做到的?
谢谢。
答案 0 :(得分:26)
重要的是按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()
答案 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))
答案 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)
答案 3 :(得分:3)
答案 4 :(得分:0)
任何尝试使用新的0.11.0版本构建相同图的人,Seaborn都会或正在不赞成使用distplot并将其替换为displot。
因此,新版本的代码应该是:
=INDEX(SPLIT(SUBSTITUTE(A1:A,"x"," and "),"_"),0,3)
答案 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'
)
这里的图片很小,但是如果您右键单击图片并在新标签页或窗口中打开它,您可以更好地看到细节。