Пользовательский биннинг в парном графике Seaborn

Я новичок в seaborn, и в настоящее время я играю с функциями pairplot... Со следующими

seaborn.pairplot(data,
                 hue = "Class",
                 diag_king = "hist",
                 diag_kws = {'alpha'=0.5}
                 )

Я могу добиться большей части того, что хочу: сетка точечных диаграмм из моего pandas фрейма данных data, с отдельными распределениями по столбцу Class и полупрозрачными гистограммами по диагонали.

Я понял, что, передав bin=[...] в diag_kws, я могу заставить все диагональные участки принять этот биннинг, но я бы хотел, чтобы каждый столбец моего фрейма данных брал свой биннинг из выделенного словаря (с ключами имена столбцов).

Можно ли добиться этого с помощью diag_kws? Или мне нужно получить доступ к каждому из диагональных графиков отдельно после вызова pairplot и перекомпоновать их вручную? Какой самый эффективный способ?

PairGrid предлагает map_diag, который можно использовать для сопоставления пользовательской функции, которая изменяет параметры при каждом вызове.
ImportanceOfBeingErnest 30.05.2019 21:05

@ImportanceOfBeingErnest Спасибо за предложение! Я вижу, как я могу использовать методы pyplot с map_diag, но как мне создать пользовательскую функцию, которая обращается к имени отображаемой переменной?

Demosthene 30.05.2019 21:10

Я думаю, что нет эквивалента FacetGridmap_dataframe для PairGrid, верно? В этом случае нужно проявить изобретательность. Например. количество раз, когда функция вызывается, указывает, для каких осей она работает в данный момент, или текущее положение осей в сетке... Однако я ничего из этого не пробовал.

ImportanceOfBeingErnest 30.05.2019 21:20

Хорошо, после вызова g = seaborn.pairplot(...) я могу зациклиться на диагональных элементах g.axes и попробовать установить там бины... Это кажется слишком хакерским, но я думаю, что это нужно сделать... :)

Demosthene 30.05.2019 22:06

Ммм, я не это имел в виду, но это тоже возможно, конечно. Я представил свое предложение в качестве ответа ниже.

ImportanceOfBeingErnest 31.05.2019 03:58
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
2 251
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

PairGrid предлагает map_diag, который можно использовать для сопоставления пользовательской функции, которая изменяет параметры при каждом вызове. Это может выглядеть так. Имейте в виду, что нужно позаботиться о порядке (через аргумент vars), чтобы убедиться, что применяются правильные параметры.

import matplotlib.pyplot as plt
import seaborn as sns


iris = sns.load_dataset("iris", cache=True)
col_list = ['petal_length', 'petal_width', 'sepal_length', 'sepal_width'] 
cols = iter(col_list)

bins = {'sepal_length' : 10, 'sepal_width' : 5, 
        'petal_length' : 35, 'petal_width' : 12}


def myhist(x, **kwargs):
    b = bins[next(cols)]
    plt.text(0.5,0.9, f"bins = {b}", ha = "center", 
             transform=plt.gca().transAxes)
    plt.hist(x, bins=b, **kwargs)


g = sns.PairGrid(iris, vars=col_list)
g = g.map_diag(myhist)
g = g.map_offdiag(plt.scatter)

plt.show()

Я использую pairplot, как установить оси для каждого графика? У меня есть график 4 на 4 с разными значениями диапазона.

arilwan 18.02.2020 19:00

Другие вопросы по теме