如何将pandas数据的seaborn pointplot按对照组均值标准化
实现方案
核心思路是先对原数据集的VELOCITY做分组归一化,以每个condition下FRONT细胞类型的VELOCITY均值为基准,再用归一化后的数据绘图即可,不需要修改原绘图逻辑的其他参数。
步骤1:计算归一化后的速度值
你可以选择两种实现方式,效果完全一致:
写法1(可读性更高)
# 计算每个condition下FRONT细胞的VELOCITY均值 front_mean = df_cells[df_cells['CELL TYPE'] == 'FRONT'].groupby('condition')['VELOCITY'].mean().reset_index(name='front_mean_val') # 把均值匹配回原数据集 df_cells = df_cells.merge(front_mean, on='condition', how='left') # 生成归一化后的速度:每个速度值除以对应condition的FRONT均值 df_cells['NORMALIZED_VELOCITY'] = df_cells['VELOCITY'] / df_cells['front_mean_val']
写法2(更简洁的单行实现)
df_cells['NORMALIZED_VELOCITY'] = df_cells.groupby('condition')['VELOCITY'].transform( lambda x: x / x[df_cells.loc[x.index, 'CELL TYPE'] == 'FRONT'].mean() )
步骤2:用归一化后的数据绘图
只需要把原绘图代码的y参数替换为新生成的NORMALIZED_VELOCITY列即可,其他参数完全保留:
from matplotlib import pyplot as plt import seaborn as sns import pandas as pd # 你的示例数据集 df_cells = pd.DataFrame(data = {'VELOCITY':[1.4,1.6,1.3,1.1,0.8,0.7,2.3,1.8,1.7,1.5,1.6,1.7],'condition':['A1','A1','A1','A1','A1','A1','A2','A2','A2','A2','A2','A2'],'CELL TYPE':['FRONT','FRONT','MIDDLE','MIDDLE','BACK','BACK','FRONT','FRONT','MIDDLE','MIDDLE','BACK','BACK']}) # 先执行上面的归一化代码 df_cells['NORMALIZED_VELOCITY'] = df_cells.groupby('condition')['VELOCITY'].transform( lambda x: x / x[df_cells.loc[x.index, 'CELL TYPE'] == 'FRONT'].mean() ) # 绘图 fig, ax = plt.subplots(figsize=(25,12)) sns.pointplot( x='CELL TYPE', y='NORMALIZED_VELOCITY', hue='condition', ci=99, data=df_cells, ax=ax, order=['FRONT', 'MIDDLE', 'BACK'], ordered=True ) # 可选:修改Y轴标签更清晰说明归一化规则 ax.set_ylabel('Normalized Velocity (vs same condition Front mean)') plt.show()
最终归一化后所有condition的FRONT组均值都会为1,其他组的数值是相对于同condition下FRONT均值的比值,置信区间也会同步按相同比例缩放,完全匹配你需要的点线图样式。
内容的提问来源于stack exchange,提问作者Emanuele Martini
相关产品推荐
相关产品推荐

