Python 中包含 4 个面板 (2 x 2) 的 Seaborn 直方图
Seaborn histogram with 4 panels (2 x 2) in Python
我正在尝试使用 sklearn.datasets.load_iris
和 seaborn
重新创建此图像。我真的很喜欢做 fig, ax = plt.subplots()
然后使用 seaborn
的 ax=ax
属性的想法。我不知道如何重现这个情节:
我检查了 Whosebug 并发现了这个,但它覆盖了它们
这是我的代码和情节:
# Iris Dataset
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
%matplotlib inline
DF_data = pd.DataFrame(load_iris().data,
columns = load_iris().feature_names,
index = ["iris_%d" % i for i in range(load_iris().data.shape[0])])
Se_targets = pd.Series(load_iris().target,
index = ["iris_%d" % i for i in range(load_iris().data.shape[0])],
name = "Targets")
#Visualizing Iris Data
D_targets = {0: 'Iris-Setosa',
1: 'Iris-Versicolor',
2: 'Iris-Virgnica'}
D_features = {0: 'sepal length [cm]',
1: 'sepal width [cm]',
2: 'petal length [cm]',
3: 'petal width [cm]'}
fig, ax = plt.subplots(nrows=2, ncols=2, figsize=(8, 6))
idx_feature = 0
#Plot on 2 x 2 ax object
for i in range(ax.shape[0]):
for j in range(0, ax.shape[1]):
for idx_target, label_target in list(D_targets.items()):
sns.distplot(DF_data.as_matrix()[Se_targets==idx_target, idx_feature],
label=D_features[idx_feature],
kde=False,
bins=10,
ax=ax[i][j])
idx_feature += 1
plt.legend(loc='upper right', fancybox=True, fontsize=8)
plt.tight_layout()
plt.show()
我的情节看起来很糟糕:
更新:
作为对@Cel 回答的回应,我已经完成了这个图,但我无法修复标签并使图周围的线条变暗。
这里的问题是您使用布尔系列而不是布尔 numpy 数组索引 numpy 数组。
sns.distplot(DF_data.as_matrix()[Se_targets==idx_target, idx_feature],
label=D_targets[idx_target],
kde=False,
bins=10,
ax=ax[i][j])
我同意这是非常不直观的。事实上,numpy已经告诉你以后会改变这个:
DF_data.as_matrix()[Se_targets==idx_target, 2]
/Users/ch/miniconda/envs/sci34/lib/python3.4/site-packages/IPython/kernel/main.py:1: FutureWarning: in the future, boolean array-likes will be handled as a boolean array index
现在,这应该适合你:
sns.distplot(DF_data.as_matrix()[Se_targets.as_matrix()==idx_target, idx_feature],
label=D_features[idx_feature],
kde=False,
bins=10,
ax=ax[i][j])
这是完整的代码:
# Iris Dataset
import pandas as pd
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
sns.set_style('whitegrid')
%matplotlib inline
DF_data = pd.DataFrame(load_iris().data,
columns = load_iris().feature_names,
index = ["iris_%d" % i for i in range(load_iris().data.shape[0])])
Se_targets = pd.Series(load_iris().target,
index = ["iris_%d" % i for i in range(load_iris().data.shape[0])],
name = "Targets")
#Visualizing Iris Data
D_targets = {0: 'Iris-Setosa',
1: 'Iris-Versicolor',
2: 'Iris-Virgnica'}
D_features = {0: 'sepal length [cm]',
1: 'sepal width [cm]',
2: 'petal length [cm]',
3: 'petal width [cm]'}
fig, ax = plt.subplots(nrows=2, ncols=2, figsize=(8, 6))
idx_feature = 0
#Plot on 2 x 2 ax object
for i in range(ax.shape[0]):
for j in range(0, ax.shape[1]):
for idx_target, label_target in list(D_targets.items()):
plot = sns.distplot(DF_data.as_matrix()[Se_targets.as_matrix()==idx_target, idx_feature],
label=D_features[idx_feature],
kde=False,
bins=10,
ax=ax[i][j])
plot.set_xlabel(D_features[idx_feature])
idx_feature += 1
plt.legend(loc='upper right', fancybox=True, fontsize=8)
plt.tight_layout()
或者你也可以
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
iris = sns.load_dataset("iris")
iris_long = pd.melt(iris, "species", var_name="measurement")
g = sns.FacetGrid(iris_long, hue="species", col="measurement", col_wrap=2, sharex=False)
g.map(plt.hist, "value", alpha=.4)
我正在尝试使用 sklearn.datasets.load_iris
和 seaborn
重新创建此图像。我真的很喜欢做 fig, ax = plt.subplots()
然后使用 seaborn
的 ax=ax
属性的想法。我不知道如何重现这个情节:
我检查了 Whosebug 并发现了这个,但它覆盖了它们
这是我的代码和情节:
# Iris Dataset
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
%matplotlib inline
DF_data = pd.DataFrame(load_iris().data,
columns = load_iris().feature_names,
index = ["iris_%d" % i for i in range(load_iris().data.shape[0])])
Se_targets = pd.Series(load_iris().target,
index = ["iris_%d" % i for i in range(load_iris().data.shape[0])],
name = "Targets")
#Visualizing Iris Data
D_targets = {0: 'Iris-Setosa',
1: 'Iris-Versicolor',
2: 'Iris-Virgnica'}
D_features = {0: 'sepal length [cm]',
1: 'sepal width [cm]',
2: 'petal length [cm]',
3: 'petal width [cm]'}
fig, ax = plt.subplots(nrows=2, ncols=2, figsize=(8, 6))
idx_feature = 0
#Plot on 2 x 2 ax object
for i in range(ax.shape[0]):
for j in range(0, ax.shape[1]):
for idx_target, label_target in list(D_targets.items()):
sns.distplot(DF_data.as_matrix()[Se_targets==idx_target, idx_feature],
label=D_features[idx_feature],
kde=False,
bins=10,
ax=ax[i][j])
idx_feature += 1
plt.legend(loc='upper right', fancybox=True, fontsize=8)
plt.tight_layout()
plt.show()
我的情节看起来很糟糕:
更新:
作为对@Cel 回答的回应,我已经完成了这个图,但我无法修复标签并使图周围的线条变暗。
这里的问题是您使用布尔系列而不是布尔 numpy 数组索引 numpy 数组。
sns.distplot(DF_data.as_matrix()[Se_targets==idx_target, idx_feature],
label=D_targets[idx_target],
kde=False,
bins=10,
ax=ax[i][j])
我同意这是非常不直观的。事实上,numpy已经告诉你以后会改变这个:
DF_data.as_matrix()[Se_targets==idx_target, 2]
/Users/ch/miniconda/envs/sci34/lib/python3.4/site-packages/IPython/kernel/main.py:1: FutureWarning: in the future, boolean array-likes will be handled as a boolean array index
现在,这应该适合你:
sns.distplot(DF_data.as_matrix()[Se_targets.as_matrix()==idx_target, idx_feature],
label=D_features[idx_feature],
kde=False,
bins=10,
ax=ax[i][j])
这是完整的代码:
# Iris Dataset
import pandas as pd
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
sns.set_style('whitegrid')
%matplotlib inline
DF_data = pd.DataFrame(load_iris().data,
columns = load_iris().feature_names,
index = ["iris_%d" % i for i in range(load_iris().data.shape[0])])
Se_targets = pd.Series(load_iris().target,
index = ["iris_%d" % i for i in range(load_iris().data.shape[0])],
name = "Targets")
#Visualizing Iris Data
D_targets = {0: 'Iris-Setosa',
1: 'Iris-Versicolor',
2: 'Iris-Virgnica'}
D_features = {0: 'sepal length [cm]',
1: 'sepal width [cm]',
2: 'petal length [cm]',
3: 'petal width [cm]'}
fig, ax = plt.subplots(nrows=2, ncols=2, figsize=(8, 6))
idx_feature = 0
#Plot on 2 x 2 ax object
for i in range(ax.shape[0]):
for j in range(0, ax.shape[1]):
for idx_target, label_target in list(D_targets.items()):
plot = sns.distplot(DF_data.as_matrix()[Se_targets.as_matrix()==idx_target, idx_feature],
label=D_features[idx_feature],
kde=False,
bins=10,
ax=ax[i][j])
plot.set_xlabel(D_features[idx_feature])
idx_feature += 1
plt.legend(loc='upper right', fancybox=True, fontsize=8)
plt.tight_layout()
或者你也可以
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
iris = sns.load_dataset("iris")
iris_long = pd.melt(iris, "species", var_name="measurement")
g = sns.FacetGrid(iris_long, hue="species", col="measurement", col_wrap=2, sharex=False)
g.map(plt.hist, "value", alpha=.4)