You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何整理多层列索引DataFrame以绘制拆分小提琴图/箱线图

解决方案:转换DataFrame为长格式即可满足需求

你当前的多层列索引DataFrame属于宽格式,而seaborn的split=True参数要求数据是长格式(tidy data)——也就是每一行对应一个独立的数据点,包含分组信息(子分组V1/VMA3、条件rest/task)和数值。只需要通过Pandas的内置方法重构数据格式,不需要更换底层数据组织方式。

具体步骤

1. 数据结构转换逻辑

你的原始DataFrame列是多层索引:

  • 第一层:rest/task(条件分组)
  • 第二层:V1/V2/VMA3(子分组)

我们需要把这两层列索引转换成普通列,同时把所有数值整理到一列中,最终得到包含三列的长格式数据:

  • region:子分组(V1/VMA3等)
  • condition:条件(rest/task)
  • value:对应的数据值

2. 代码实现(含模拟数据示例)

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

# 模拟你的多层列索引DataFrame(729条数据)
regions = ["V1", "V2", "VMA3"]
conditions = ["rest", "task"]
df = pd.DataFrame(
    np.random.randn(729, len(regions)*len(conditions)),
    columns=pd.MultiIndex.from_product([conditions, regions], names=["condition", "region"])
)

# 转换为长格式(两种方法二选一)
# 方法1:用melt直接拆分多层列
df_long = df.melt(var_name=["condition", "region"], value_name="value")

# 方法2:用stack重构索引
# df_long = df.stack(level="region").reset_index().rename(columns={0: "value"})

# 绘制拆分小提琴图
sns.violinplot(data=df_long, x="region", y="value", hue="condition", split=True)
plt.show()

# 若要绘制箱线图,替换为:
# sns.boxplot(data=df_long, x="region", y="value", hue="condition", split=True)

关键说明

  • split=True的作用是:在同一个x轴类别(子分组V1/VMA3)下,将hue指定的两个分组(rest/task)的分布合并到同一个图中左右拆分展示。
  • 长格式是seaborn分类绘图的标准输入格式,能让库自动识别分组关系,避免把rest/task拆成独立子图。

内容的提问来源于stack exchange,提问作者Philipp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 10:12:07