Я изо всех сил пытался визуализировать перенос столбцов подзаголовков на графиках гистограммы Seaborn (kdeplot, histplot). Пробовал разные вещи, включая fig, ax и enumerate(zip(df.columns, ax.flatten()).
Вот набор данных
for col in df.columns:
plt.figure(figsize = (3,3))
sns.histplot(df, x = col, kde = True, bins = 40, hue = 'Dataset', fill = True)
plt.show();
Как можно сделать графики с другими морскими графиками или графиками с функцией обтекания граней?






col_wrap указывает количество столбцов.
nrows и ncols при использовании графиков на уровне осей.'Female' и 'Male' следует показывать отдельно, потому что гендерная статистика часто отличается, поэтому представление их вместе может исказить впечатление от данных.'Gender' дает наилучший вариант отображения.python 3.11.3, pandas 2.0.1, matplotlib 3.7.1, seaborn 0.12.2import pandas as pd
import seaborn as sns
# load the dataset downloaded from https://www.kaggle.com/uciml/indian-liver-patient-records
df = pd.read_csv('d:/data/kaggle/indian_liver_patient.csv')
# convert the data to a long form
dfm = df.melt(id_vars=['Gender', 'Dataset'])
# plot the data for each gender
for gender, data in dfm.groupby('Gender'):
g = sns.displot(kind='hist', data=data, x='value', col='variable', hue='Dataset',
hue_order=[1, 2], common_norm=False, common_bins=False,
multiple='dodge', kde=True, col_wrap=3, height=2.5, aspect=2,
facet_kws = {'sharey': False, 'sharex': False}, palette='tab10')
fig = g.fig
fig.suptitle(f'Gender: {gender}', y=1.02)
fig.savefig(f'hist_{gender}.png', bbox_inches='tight')
common_bins=False означает, что ячейки двух групп оттенков не совпадают. Однако установка его на True приводит к игнорированию sharex=False, поэтому все пределы оси X будут от 0 до 2000, как видно на этом графике.col_wrap нельзя использовать, если row также используется.g = sns.displot(kind='hist', data=dfm, x='value', row='Dataset', col='variable', hue='Gender',
common_norm=False, common_bins=False, multiple='dodge', kde=True,
facet_kws = {'sharey': False, 'sharex': False})
g.fig.savefig('hist.png')
'Gender'.g = sns.displot(kind='hist', data=dfm, x='value', col='variable', col_wrap=3,
hue='Dataset', common_norm=False, common_bins=False,
multiple='dodge', kde=True, height=2.5, aspect=2,
facet_kws = {'sharey': False, 'sharex': False}, palette='tab10')
common_bins=True.import seaborn as sns
import numpy as np
import pandas as pd
# load the dataset
df = pd.read_csv('d:/data/kaggle/indian_liver_patient.csv')
# convert the data to a long form
dfm = df.melt(id_vars=['Gender', 'Dataset'])
# iterate through the data for each gender
for gen, data in dfm.groupby('Gender'):
# create the figure and axes
fig, axes = plt.subplots(3, 3, figsize=(11, 5), sharex=False, sharey=False, tight_layout=True)
# flatten the array of axes
axes = axes.flatten()
# iterate through each axes and variable category
for ax, (var, sel) in zip(axes, data.groupby('variable')):
sns.histplot(data=sel, x='value', hue='Dataset', hue_order=[1, 2], kde=True, ax=ax,
common_norm=False, common_bins=True, multiple='dodge', palette='tab10')
ax.set(xlabel='', title=var.replace('_', ' ').title())
ax.spines[['top', 'right']].set_visible(False)
# remove all the legends except for Aspartate Aminotrnsferase, which will be move to used for the figure
for ax in np.append(axes[:5], axes[6:]):
ax.get_legend().remove()
sns.move_legend(axes[5], bbox_to_anchor=(1, 0.5), loc='center left', frameon=False)
fig.suptitle(f'Gender: {gen}', y=1.02)
fig.savefig(f'hist_{gen}.png', bbox_inches='tight')
df имеют значительные выбросы. Их удаление улучшит визуализацию гистограммы.from scipy.stats import zscore
from typing import Literal
def remove_outliers(data: pd.DataFrame, method: Literal['std', 'z'] = 'std') -> pd.DataFrame:
# remove outliers with std or zscore
if method == 'std':
std = data.value.std()
low = data.value.mean() - std * 3
high = data.value.mean() + std * 3
data = data[data.value.between(low, high)]
else:
data = data[(np.abs(zscore(data['value'])) < 3)]
return data
# iterate through the data for each gender
for gen, data in dfm.groupby('Gender'):
...
# iterate through each axes and variable category
for ax, (var, sel) in zip(axes, data.groupby('variable')):
# remove outliers of specified columns
if var in df.columns[2:7]:
sel = remove_outliers(sel)
sns.histplot(data=sel, x='value', hue='Dataset', hue_order=[1, 2], kde=True, ax=ax,
common_norm=False, common_bins=True, multiple='dodge', palette='tab10')
....
....
Хорошо, рассмотрим случай, когда точки, идентифицированные как выбросы признака 1, не совпадают с точками, идентифицированными как выбросы признака 2, и так далее. Не потеряем ли мы тогда часть данных? Я наблюдал подобные моменты, особенно в наборах данных о ценах на жилье.
Эй, спасибо за ответ. Это очень помогает! У меня есть вопрос относительно этой стратегии обработки выбросов. Почему вы перебрали все функции, чтобы удалить выбросы за пределами 3 * std? Что произойдет, если точка данных имеет только 1 объект с выбросами, а остальные объекты являются выбросами? Не потеряем ли мы информацию?