Построить парные данные с использованием Seaborn - PullRequest
0 голосов
/ 29 апреля 2020

Есть ли способ создать диаграмму рассеяния при использовании seaborn, где значения (x, y) являются парными? Я бы хотел, чтобы ось X представляла значения в условии A, а ось Y представляла значения в условии B. Конкретно, предположим, что ось X - это вес пациента до лечения, а ось Y - вес пациента после лечения. Мои данные отформатированы следующим образом:

df = pd.DataFrame(
    {'n': [1, 2, 3, 1, 2, 3], 
    'treatment': ['before', 'before', 'before', 'after', 'after', 'after'], 
    'weight': np.random.rand(6)})

   n treatment    weight
0  1    before  0.431438
1  2    before  0.053631
2  3    before  0.567058
3  1     after  0.324254
4  2     after  0.624151
5  3     after  0.519498

Я думаю, это квалифицируется как аккуратные данные, но единственная переменная, которую я хочу построить, - это вес. Вся документация, которую я вижу для seaborn, показывает примеры для парных данных, таких как построение переменной x каждого элемента и переменной y каждого элемента. Например, sepal_length против sepal_width. Но как я могу построить x по сравнению с y, если мои x и y взяты из одного и того же столбца?

Является ли решение переформатировать мои данные, чтобы у меня были столбцы weight_before и weight_after? Если да, можете ли вы предоставить самый чистый способ изменения данных, используя pandas? Я знаю, что могу сделать что-то вроде следующего, но я чувствую, что это не очень хороший синтаксис.

df['weight_before'] = df['weight']
df.loc[df['treatment'] != 'before', 'weight_before'] = np.nan
# and similar for df['weight_after']

Ответы [ 2 ]

2 голосов
/ 29 апреля 2020

Если я правильно понимаю ваш вопрос, это может сработать для вас:

sns.lmplot(data=df.pivot(index='n', columns='treatment', values='weight'),
           x='before', y='after', fit_reg=False)
1 голос
/ 29 апреля 2020

Другой способ сделать это

Повернуть кадр данных;

df2=pd.pivot_table(df, index='n',columns='treatment', values='weight', aggfunc=np.sum)


df2.reset_index(drop=True, inplace=True)

Разброс графиков

ax = sns.scatterplot(x="before", y="after",data=df2)

Цепное решение

ax = sns.scatterplot(x="before", y="after",data=pd.pivot_table(df, index='n',columns='treatment', values='weight', aggfunc=np.sum).reset_index(drop=True))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...