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

零基础求助:如何用Python解析多维数据并绘制箱线图/小提琴图

Hey there! 作为Python零基础的同学,完全不用慌——Python处理这类多维分组数据的工具比Matlab的cell array更灵活直观,而且画箱线图/小提琴图也超级方便。我一步步给你讲清楚:

一、解析/存储这类多维分组数据的Python方案

你提到Matlab里用cell array,Python里有类似的替代,但更推荐结构化的方式,尤其是pandas.DataFrame,它能让你后续的统计和画图工作事半功倍:

1. 类似Cell Array的基础方案:嵌套列表

如果先从熟悉的逻辑入手,你可以用列表的列表的列表来存储:

  • 外层列表对应20组数据
  • 每个组的列表里包含5个元素,每个元素是对应变量的原始数据列表(20~100条数值)

示例结构:

# 模拟数据结构
data = [
    [
        [1.2, 3.1, ...],  # Group 1的Var1数据
        [2.5, 4.3, ...],  # Group 1的Var2数据
        # ... 剩下3个变量
    ],
    # ... 剩下19个组
]

但这种方式后续筛选、统计会比较麻烦,所以更推荐下面的DataFrame方案。

2. 更优的结构化方案:Pandas DataFrame(强烈推荐)

把数据整理成**长格式(Long Format)**的DataFrame,三列分别对应:

  • Group:组标识(比如Group 1到Group 20)
  • Variable:变量标识(比如Var 1到Var 5)
  • Value:原始数据的单个数值

不管每组每个变量有多少条数据,都能轻松塞进这个结构里,而且后续画图直接调用列名就行。

比如模拟你的数据集:

import pandas as pd
import numpy as np

# 定义组和变量名称
groups = [f"Group {i+1}" for i in range(20)]
variables = [f"Var {j+1}" for j in range(5)]

# 构造长格式数据
raw_data = []
for group in groups:
    for var in variables:
        # 随机生成20~100条原始数据
        sample_count = np.random.randint(20, 101)
        values = np.random.normal(loc=np.random.randn(), scale=1, size=sample_count)
        # 把每条数据拆成一行存入列表
        for val in values:
            raw_data.append({"Group": group, "Variable": var, "Value": val})

# 转成DataFrame
df = pd.DataFrame(raw_data)

如果你的原始数据是CSV/TXT文件,用pd.read_csv()读取后,再用pd.melt()转成长格式就行,比如宽格式转长格式:

# 假设原始数据是宽格式:列名是Group1_Var1, Group1_Var2...
df_wide = pd.read_csv("your_data.csv")
# 转成长格式
df_long = pd.melt(df_wide, var_name="Group_Var", value_name="Value")
# 拆分组和变量列
df_long[["Group", "Variable"]] = df_long["Group_Var"].str.split("_", expand=True)
二、绘制箱线图/小提琴图的工具

Python里最常用的是matplotlib和seaborn,其中seaborn对新手更友好,代码简洁,画出来的图也好看。

1. 箱线图(Box Plot)

import seaborn as sns
import matplotlib.pyplot as plt

# 设置绘图风格
sns.set_style("whitegrid")

# 绘制箱线图:按组和变量分组展示
plt.figure(figsize=(15, 8))  # 设置图的大小
sns.boxplot(x="Group", y="Value", hue="Variable", data=df)
plt.title("Box Plot by Group and Variable")
plt.xticks(rotation=45)  # 旋转x轴标签避免重叠
plt.tight_layout()  # 自动调整布局
plt.show()

2. 小提琴图(Violin Plot)

只需要把boxplot换成violinplot就行:

plt.figure(figsize=(15, 8))
sns.violinplot(x="Group", y="Value", hue="Variable", data=df, split=False)
plt.title("Violin Plot by Group and Variable")
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
为什么比Matlab的Cell Array更优?

用DataFrame的话,你不需要手动遍历每个cell去提取数据,直接通过列名就能筛选任意组、任意变量的数据,而且画图时只需要指定对应的列参数,不用手动整理每组的数据集,效率高很多,也更直观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:21:38