Хотя ваш желаемый результат немного неясен, рассмотрите плавление ваших данных перед построением графика, чтобы иметь один столбец индикатора для Стадия тестирования и один столбец значения для Тестовое значение . Затем построите график с помощью 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')
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')
Дополнительные данные
Если должно быть больше, чем просто 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'])
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'])