Гистограмма на море с 4 панелями (2 x 2) в Python

Я пытаюсь воссоздать этот образ, используя sklearn.datasets.load_iris и seaborn . Мне очень нравится идея делать fig, ax = plt.subplots() а затем использовать seaborn ax=ax seaborn . Я не могу понять, как воссоздать этот сюжет: введите описание изображения здесь

Я проверил на stackoverflow и нашел это, но он накладывает их. Как построить несколько гистограмм на одном и том же участке с морским коньком

Вот мой код и сюжет:

 # 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 с булевой последовательностью вместо массива boolean 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: в будущем boolean array-likes будет обрабатываться как индекс булевого массива

На данный момент это должно сработать для вас:

 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) 

введите описание изображения здесь