Как построить матрицу искажений Seaborn для всех столбцов во фрейме данных

#python #pandas #seaborn

#python #pandas #seaborn

Вопрос:

Представьте, что у меня есть фрейм данных с 9 столбцами. Я хочу иметь возможность достичь того же эффекта, что и df.hist (), но с помощью sns.distplot().

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

Я немного поэкспериментировал с использованием цикла for по осям и столбцам для фрейма данных, но я могу добиться результатов только для указания столбцов. Я не уверен, как представить код для работы со строками и столбцами.

Я также заглянул в sns.FacetGrid, но я не уверен, как решить эту проблему с помощью FacetGrid.

Я нахожу, что функция df.hist () соответствует именно тому, что я хочу, но я хочу иметь возможность выполнять это с помощью sns.distplot для всех столбцов в том же представлении, что и выходные данные df.hist().

Если это поможет определить контекст фрейма данных, я, по сути, читаю учебные и тестовые наборы Google Colab для набора данных California Housing Dataset, который содержит все столбцы, за исключением ocean_proximity. Если вы хотите помочь мне разобраться с этой проблемой, используя этот набор данных, пожалуйста, получите его из Kaggle и удалите столбец ocean_proximity.

Мой подход для 9 столбцов:

 import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_csv('housing.csv')
df.drop('ocean_proximity', axis=1, inplace=True)
fig, axes = plt.subplots(ncols=len(df.columns), figsize=(30,15))
for ax, col in zip(axes, df.columns):
  sns.distplot(df[col], ax=ax)
  plt.tight_layout() 
plt.show()
  

Ответ №1:

Вы можете создать несколько фигур с помощью matplotlib, используя вложенные графики, подобные этому

 import matplotlib.pyplot as plt
# Define the number of rows and columns you want
n_rows=3
n_cols=3
# Create the subplots
fig, axes = plt.subplots(nrows=n_rows, ncols=n_cols)
  

Вы можете просмотреть функцию subplots как создающую матрицу (2D массив) формы [n_rows, n_cols] и использующую координаты элементов матрицы для выбора места построения.

Затем вы строите каждый столбец в другом подзаголовке с ax аргументом, чтобы указать координаты элемента matrix. Использование ax=axes[i,j] укажет вспомогательный график, на котором вы хотите напечатать:

 for i, column in enumerate(df.columns):
    sns.distplot(df[column],ax=axes[i//n_cols,i%n_cols])
  

Из комментария Бенкальдвелла «i / / ncols дает разделение по этажам, которое является строкой, когда вы работаете слева направо, а затем сверху вниз. i%ncols выдаст вам целочисленный остаток, который является столбцом, когда вы работаете слева направо сверху вниз.»

Если вы хотите построить дискретный набор данных вместо использования distplot для оценки распределения данных, лежащих в основе ваших данных, вы можете использовать новую функцию histplot.

Комментарии:

1. Прекрасное решение, Брюс! Большое вам спасибо. Я получил именно ту визуализацию, которую хотел 🙂

2. Будет хорошо, если вы также сможете прикрепить изображение. Это будет полезно для пользователей.

3. Немного более элегантный imo: « импортируйте matplotlib.pyplot как plt для i, столбец в enumerate(df.columns): sns.distplot(df[столбец],ax=axes[i//3,i%3]) «

4. Из примера неясно, потому что nrows и ncols одинаковы, но ncols следует использовать для вычисления обоих измерений осей: sns.distplot(df[column],ax=axes[i//ncols,i%ncols])

5. @BruceSwain мой пример отлично сработал для меня с 2 строками и 7 столбцами. i//ncols дает разделение по этажам, которое является строкой, когда вы работаете слева направо, а затем сверху вниз. i%ncols даст вам целочисленный остаток, который является столбцом, когда вы работаете слева направо, сверху вниз.

Ответ №2:

Немного более элегантный imo, чем решение @Bruce Swain:

 import matplotlib.pyplot as plt
import seaborn as sns

for i, column in enumerate(df.columns, 1):
    plt.subplot(3,3,i)
    sns.histplot(df[column])
  

Ответ №3:

Это должно сработать:

 fig, axes = plt.subplots(nrows = 3, ncols = 3)    # axes is 2d array (3x3)
axes = axes.flatten()         # Convert axes to 1d array of length 9
fig.set_size_inches(15, 15)

for ax, col in zip(axes, train.columns):
  sns.distplot(train[col], ax = ax)
  ax.set_title(col)