Изобразите различные функции регрессии для разных переменных с помощью Seaborn PairGrid, regplot - PullRequest
2 голосов
/ 23 апреля 2020

Моя проблема в том, как мне построить регрессию в seaborn PairGrid, которая будет зависеть от того, какая переменная отображается, а не от верхней, нижней или диагональной позиции? Например, у меня есть набор данных tips, и я считаю, что 'size' коррелируется как полином второго порядка независимо от другой переменной ie. вся строка / столбец в парной сетке я хочу иметь таким, но больше ничего. Однако я могу только сопоставить эту корреляцию с верхним / нижним треугольником для всех графиков , например:

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

tips = sns.load_dataset("tips")

smoke = sns.PairGrid(tips, vars=['total_bill', 'tip','size'])
smoke.map_upper(sns.regplot, color = 'k', order=2)
smoke.map_diag(sns.kdeplot)
smoke.map_lower(sns.regplot, color = 'b')

Fig 1

Возможно ли это с морским рожком? И если я go еще дальше, что, если я хочу проверить / построить экспоненциальную корреляцию между, например. 'tip' и 'total_bill' только внутри пары, это возможно? Как мне это сделать?

Я знаю, что могу просто взять этот конкретный случай c снаружи и нанести его отдельно или использовать GridSpe c, но мне интересно, есть ли более простой способ , Спасибо


РЕДАКТИРОВАТЬ (26.4.): Дополнительный вопрос, как использовать hue в этой настройке. Если я использую просто:

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

tips = sns.load_dataset("tips")
vars = ['total_bill', 'tip','size']

smoke = sns.PairGrid(tips, vars=vars, hue='smoker')
smoke.map_upper(plt.scatter)
smoke.map_diag(sns.kdeplot)
smoke.map_lower(plt.scatter)

# Add 2nd order polynomial regression to the 'size' column
for ax,y in zip(smoke.axes[:2,2],vars):
    sns.regplot(ax=ax, data=tips, x='size', y=y, order=2, scatter=False)
    ax.set_ylabel('')
    ax.set_xlabel('')

# Add logarithmic regression
sns.regplot(ax=smoke.axes[2,0], data=tips, x="total_bill", y='size', logx=True, scatter=False)

Это делает то, что я хочу, ie регрессия логарифмическая c, но очень странно. Он устанавливает синий цвет только для первого ряда, оранжевый - только для второго ряда, а затем создает зеленый цвет для первого столбца, последнего ряда, как показано на следующем рисунке. Поэтому мой вопрос, как это исправить и почему это происходит в первую очередь. Неужели hue создает новый набор axes, который затем необходимо повторить?

Fig 2. -- add hue

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

PairGrid позволяет отображать только диагональ, недиагональ, а также верхний и нижний треугольники. Если вам нужен более точный контроль зерна на графиках, вы можете получить доступ к объекту отдельных осей, используя PairGrid.axes (2D-массив):

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

tips = sns.load_dataset("tips")
vars = ['total_bill', 'tip','size']

smoke = sns.PairGrid(tips, vars=vars)
smoke.map_upper(plt.scatter, color = 'k')
smoke.map_diag(sns.kdeplot)
smoke.map_lower(plt.scatter, color = 'b')

# Add 2nd order polynomial regression to the 'size' column
for ax,y in zip(smoke.axes[:2,2],vars):
    sns.regplot(ax=ax, data=tips, x='size', y=y, order=2, color='k', scatter=False)

# Add logarithmic regression
sns.regplot(ax=smoke.axes[2,0], data=tips, x="total_bill", y='size', logx=True, color='b', scatter=False)

enter image description here

РЕДАКТИРОВАТЬ: решение, которое работает с расщеплением оттенка

В этом случае необходимо выполнить регрессию для каждого подмножества данных и построить на тех же осях.

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

tips = sns.load_dataset("tips")
vars = ['total_bill', 'tip','size']
hue_col = 'smoker'
hue_order=['Yes','No']

smoke = sns.PairGrid(tips, vars=vars, hue='smoker', hue_order=hue_order)
smoke.map_upper(plt.scatter)
smoke.map_diag(sns.kdeplot)
smoke.map_lower(plt.scatter)

# Add 2nd order polynomial regression to the 'size' column
for ax,y in zip(smoke.axes[:2,2],vars):
    for hue in hue_order:
        sns.regplot(ax=ax, data=tips.loc[tips[hue_col]==hue], x='size', y=y, order=2, scatter=False)
    ax.set_ylabel('')
    ax.set_xlabel('')

# Add logarithmic regression
for hue in hue_order:
    sns.regplot(ax=smoke.axes[2,0], data=tips.loc[tips[hue_col]==hue], x="total_bill", y='size', logx=True, scatter=False)

enter image description here

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

Да, это возможно, потому что вы можете указать переменные x и y отдельно, например,

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

tips = sns.load_dataset("tips")

smoke = sns.PairGrid(tips, x_vars=['total_bill', 'tip','size'], y_vars=['size'])
smoke.map(sns.regplot, color = 'k', order=2)
smoke.map_diag(sns.kdeplot)

pairplot example

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

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