Боксплот с двумя функциями - PullRequest
0 голосов
/ 01 ноября 2018

Скажем, у меня есть df, состоящий из 3 столбцов [«Y / N», «Test Before», «Test After»], где «Y / N» - логическое значение, а «Test Before», «Test After» - плавающее .

например,

'Y/N'    'Test Before'    'Test After'
True         75               100
False        75                50
True         50                60
False        50                40
  ...

Я могу использовать df.boxplot(column='Test Before/Test After', by 'Y/N'), чтобы создать отдельные поля с именем столбца, каждый из которых будет сгруппирован по Y / N.

Однако я хотел бы создать отдельные поля с логическими значениями «Y / N», сгруппированные по «Test Before», «Test After», например:

Boxplot A содержит блок-графики df ['Y / N'] == True для значений x df ['Test Before'] и df ['Test After'].

Boxplot B содержит блок-графики df ['Y / N'] == False для значений x df ['Test Before'] и df ['Test After'].

1 Ответ

0 голосов
/ 02 ноября 2018

Хотя ваш желаемый результат немного неясен, рассмотрите плавление ваших данных перед построением графика, чтобы иметь один столбец индикатора для Стадия тестирования и один столбец значения для Тестовое значение . Затем построите график с помощью boxplot от Seaborn с Y / N в качестве серии легенд (оттенков) или с FacetGrid от Seaborn с отдельными графиками для каждого Y / N отличное значение. Ниже приведен список случайных данных для демонстрации:

Данные

import pandas as pd
import numpy as np

import seaborn as sns
import matplotlib.pyplot as plt

np.random.seed(11012018)
df = pd.DataFrame({'Y/N': np.random.choice([True, False], 50),
                   'Test Before': [np.random.uniform()*10 for _ in range(50)],
                   'Test After': [np.random.uniform()*10 for _ in range(50)]},
                  columns = ['Y/N', 'Test Before', 'Test After'])

# MELT DATA (WIDE TO LONG)
melt_df = df.melt(id_vars="Y/N", value_name="Test_Value", var_name="Test_Stage")
print(melt_df.head())
#      Y/N   Test_Stage  Test_Value
# 0  False  Test Before    7.573898
# 1   True  Test Before    3.487735
# 2  False  Test Before    1.506599
# 3  False  Test Before    9.833866
# 4   True  Test Before    1.340375
# 5  False  Test Before    3.678094
# 6   True  Test Before    3.407419
# 7  False  Test Before    0.427210
# 8  False  Test Before    6.988953
# 9  False  Test Before    2.912770

Участок

fig, ax = plt.subplots(figsize=(10,4))
sns.boxplot(data=melt_df, x='Test_Stage',  y='Test_Value', hue='Y/N', ax=ax)

plt.legend(loc='upper right')

Single Box Plot

g = sns.FacetGrid(melt_df, col="Y/N", height=4, aspect=6/4)
g.map(sns.boxplot, data=melt_df, x='Test_Stage',  y='Test_Value')

Grid Box Plot

Дополнительные данные

Если должно быть больше, чем просто Test_Before и Test_After значений, melt масштабируется до него с order , определяющим расположение блоков:

np.random.seed(11012018)
df['Test Middle'] = [np.random.uniform()*10 for _ in range(50)]
melt_df = df.melt(id_vars="Y/N", value_name="Test_Value", var_name="Test_Stage")

fig, ax = plt.subplots(figsize=(10,4))
sns.boxplot(data=melt_df, x='Test_Stage',  y='Test_Value', hue='Y/N', ax=ax,
            order=['Test Before', 'Test Middle', 'Test After'])

Box Plot with Three Metrics

g = sns.FacetGrid(melt_df, col="Y/N", height=4, aspect=6/4)
g.map(sns.boxplot, data=melt_df, x='Test_Stage',  y='Test_Value',
      order=['Test Before', 'Test Middle', 'Test After'])

Grid Box Plot with Three Metrics

...