Гистограмма на море с 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, я достиг этого сюжета, но я не смог зафиксировать ярлыки и затемнить линии вокруг сюжетов.
- GridSpec для нескольких подзаголовков «цифра, содержащая пройденные оси, очищается»
- Гистограмма сюжетов с цветами, взятыми из цветовой карты
- отображать гистограмму с очень неравномерной шириной бункера
- Как нарисовать гистограмму с одинаковой шириной бинов для неравномерно расположенных ячеек в matplotlib
- Как создать полную гистограмму с numpy?
Проблема здесь в том, что вы индексируете массив 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)
- заставить pip игнорировать существующее колесо
- Pandas: получить следующее значение в столбце после соответствия строки
- изменить счетчик в гистограмме Python
- Гистограмма в Matplotlib с входным файлом
- Как использовать логарифмические ячейки в гистограмме Python
- Гистограммы Python: ручная нормализация отсчетов и повторная печать в виде гистограммы
- Гистограмма Matplotlib с логом Лапласиан PDF
- Гистограмма выравнивания для python
- Как рассчитать разницу между разреженной гистограммой в Python
- Фильтрация краев гистограммы и подсчетов
- Невозможно получить гистограмму для отображения отдельных бункеров с вертикальными линиями