python - 具有 groupby 两个特征的箱线图
问题描述
假设我有一个包含 3 列 ['Y/N','Test Before','Test After'] 的 df,其中 '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”箱线图,按“测试前”、“测试后”分组,例如:
对于 x 值 df['Test Before'] 和 df['Test After'],箱线图 A 包含 df['Y/N'] == True 的箱线图。
箱线图 B 包含 x 值 df['Test Before'] 和 df['Test After'] 的 df['Y/N'] == False 箱线图。
解决方案
虽然您想要的结果有点不清楚,但请考虑在绘制之前融合您的数据,以便为Test Stage设置一个指标列,为Test Value设置一个值列。然后使用 seaborn 的箱线图绘制Y/N作为图例(色调)系列或使用 seaborn 的FacetGrid绘制每个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
对其进行缩放:
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'])
推荐阅读
- javascript - 无法使用while循环制作计时器
- php - PHP sqlsrv PDOStatement::rowCount
- r - ggplot 中的美学给出了意想不到的结果
- html - Blue Prism - Application Modeller:Web Scraping 的独特属性
- javascript - Bootstrap Popup 模式未在 Shopify 主题主页的中心弹出。相反,它显示在主页的正文中
- multithreading - 如何设置一次
- environment-variables - 无法更改 conda env 中的 HOST env 变量
- java - Firebase 实时数据库事务
- mysql - 连接同一张表时,如何将连接的数据放在单独的行而不是单独的列中?
- javascript - HTML 表格中显示多个 JSON 提要