#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)