Pandas DataFrame.hist Морской эквивалент - PullRequest
3 голосов
/ 09 апреля 2020

При исследовании I я часто использую метод Pandas 'DataFrame.hist () для быстрого отображения сетки гистограмм для каждого столбца цифр c в кадре данных, например:

import matplotlib.pyplot as plt
import pandas as pd
from sklearn import datasets


data = datasets.load_iris()
df = pd.DataFrame(data.data, columns=data.feature_names)

df.hist(bins=50, figsize=(10,7))
plt.show()

Какой создает фигуру с отдельными графиками для каждого столбца: Which produces a figure with separate plots for each column

Я пробовал следующее:

import pandas as pd
import seaborn as sns
from sklearn import datasets


data = datasets.load_iris()
df = pd.DataFrame(data.data, columns=data.feature_names)

for col_id in df.columns:
    sns.distplot(df[col_id])

Но при этом получается фигура с одним графиком и наложением всех столбцов: But this produces a figure with a single plot and all columns overlayed

Есть ли способ создать сетку гистограмм, показывающих данные из столбцов DataFrame с помощью Seaborn?

Ответы [ 5 ]

3 голосов
/ 09 апреля 2020

Вы можете воспользоваться FacetGrid от Seaborn, если вы реорганизуете свой фрейм данных, используя melt. Seaborn обычно ожидает, что данные организованы таким образом (длинный формат).

g = sns.FacetGrid(df.melt(), col='variable', col_wrap=2)
g.map(plt.hist, 'value')

enter image description here

2 голосов
/ 09 апреля 2020

Эквивалента нет, так как seaborn displot сам выберет только 1-D массив или список, может быть, вы можете попытаться сгенерировать субплоты.

fig, ax = plt.subplots(2, 2, figsize=(10, 10))

for i in range(ax.shape[0]):
    for j in range(ax.shape[1]):
        sns.distplot(df[df.columns[i*2+j]], ax=ax[i][j])

enter image description here

0 голосов
/ 09 апреля 2020

В итоге я адаптировал jcaliz, чтобы он работал более широко, то есть не только тогда, когда DataFrame имеет четыре столбца, я также добавил код для удаления любых неиспользуемых осей и обеспечения отображения осей в алфавитном порядке (как в df.hist()).

size = int(math.ceil(len(df.columns)**0.5))
fig, ax = plt.subplots(size, size, figsize=(10, 10))

for i in range(ax.shape[0]):
    for j in range(ax.shape[1]):
        data_index = i*ax.shape[1]+j
        if data_index < len(df.columns):
            sns.distplot(df[df.columns.sort_values()[data_index]], ax=ax[i][j])

for i in range(len(df.columns), size ** 2):
    fig.delaxes(ax[i // size][i % size])
0 голосов
/ 09 апреля 2020

Другой полезный метод SEABORN для быстрого отображения сетки гистограмм для каждого столбца чисел c в кадре данных. Это может быть быстрый, чистый и удобный sns.pairplot ()

try: sns.pairplot(df) у этого есть много интересных параметров, которые вы можете исследовать, например, Hue et c

пример парного графика для набора данных iris

, если вы НЕ хотите, чтобы скаттеры вы могли на самом деле очень быстро создайте настроенную сетку, используя sns.PairGrid(df), это создаст пустую сетку со всеми пробелами, и вы сможете отобразить на них все, что захотите: g = sns.pairgrid(df)

`g.map(sns.distplot)` or `g.map_diag(plt.scatter)`

et c

0 голосов
/ 09 апреля 2020

https://seaborn.pydata.org/examples/distplot_options.html

Вот пример того, как вы можете показать 4 графика, используя подзаговор, с seaborn.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...