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

如何用Seaborn在同一图中绘制Pandas DataFrame多列箱线图

解决Seaborn Boxplot按DataFrame列分组绘图的问题

这问题我当初也踩过坑!核心原因是Seaborn和Pandas的boxplot对数据格式的要求完全不一样:Pandas的boxplot()默认会把DataFrame的每一列当作独立分组来绘制,但Seaborn的boxplot()默认期望的是**长格式(long-form)**数据,而不是你现在用的宽格式(wide-form)DataFrame,直接传宽格式的df就会把所有数据混在一起画成一个箱线图。

下面给你两种可行的解决方案,都能实现和df.boxplot()一样的效果:

方法1:把宽格式数据转成长格式(推荐)

这是Seaborn官方推荐的方式,用pd.melt()把数据重塑成适合Seaborn的结构:

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

# 生成示例数据
df = pd.DataFrame(data=np.random.random(size=(4,4)), columns=['A','B','C','D'])

# 把宽格式转成长格式:列名变成分组标签,数值统一放到一列
df_melted = df.melt(var_name='列名', value_name='数值')

# 用Seaborn绘制箱线图
sns.boxplot(x='列名', y='数值', data=df_melted)
plt.show()

这种方式逻辑清晰,后续如果要添加其他分组维度(比如hue参数)也非常方便,完全契合Seaborn的设计思路。

方法2:直接指定x/y参数(无需转格式)

如果你不想转换数据格式,也可以手动构造x轴的分组标签和y轴的数值数组:

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

df = pd.DataFrame(data=np.random.random(size=(4,4)), columns=['A','B','C','D'])

# x轴:重复列名,每个列名重复的次数等于DataFrame的行数
x_labels = np.repeat(df.columns, len(df))
# y轴:把所有列的数值展平成一维数组
y_values = df.values.flatten()

# 绘制箱线图
sns.boxplot(x=x_labels, y=y_values)
plt.show()

这种方法虽然能实现效果,但可读性和扩展性不如第一种,更适合快速验证的场景。

为什么直接传df给sns.boxplot不行?

Seaborn的boxplot()如果只传入一个DataFrame,它会默认把整个数据集当作单一的变量来处理,不会自动按列拆分分组——这和Pandas的boxplot()默认行为正好相反,所以才会只画出一个箱线图。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:50:16