无需pandas.melt()/stack(),用单个Seaborn函数绘制分组箱线图
无需转换宽表,直接用Seaborn生成分组箱线图
Seaborn的boxplot函数确实支持直接基于宽表生成分组箱线图,不需要先通过pandas.melt()或stack()转换数据格式,以下是两种可行的实现方式:
方式1:利用data参数指定数据源,直接传入目标列名列表
这是最简洁的写法,直接告诉Seaborn要绘制的列,它会自动完成分组逻辑:
import random import pandas import seaborn import matplotlib.pyplot as plt random.seed(0) k = 10 df = pandas.DataFrame( { 'ID': range(k), 'catA': random.choices(range(200), k=k), 'catB': random.choices(range(200), k=k) } ) # 绘制y轴为分类(列名)、x轴为数值的箱线图,和你melt后的效果一致 seaborn.boxplot(data=df, x=['catA', 'catB']) plt.show() # 如果想把数值放在x轴、分类放在y轴,调整参数即可 seaborn.boxplot(data=df, y=['catA', 'catB']) plt.show()
方式2:直接拼接数据列,指定分类标签
如果你需要更灵活的控制,可以手动拼接数值列并对应分类标签,不需要依赖宽表的列名映射:
import numpy as np # 拼接两列的数值数据 values = np.concatenate([df['catA'], df['catB']]) # 生成对应的分类标签,每个列名重复对应行数 labels = np.tile(['catA', 'catB'], len(df)) # 绘制箱线图 seaborn.boxplot(x=values, y=labels) plt.show()
这两种方式都完全不需要转换数据格式,直接基于原始宽表即可生成你需要的分组箱线图。
内容的提问来源于stack exchange,提问作者buhtz
相关产品推荐
相关产品推荐

