基于多组不等长列表绘制Seaborn stripplot并叠加箱线图问题
实现方案
核心思路
- 首先要把不等长的列表转换为Seaborn支持的长格式DataFrame,新增分类列标记每个数值所属的列表,这是X轴可以按分类排布的核心
- 先绘制箱线图,再叠加stripplot散点,保证散点显示在箱线图层上方
- 手动固定Y轴取值范围为0~1
完整可运行代码
import seaborn as sns import pandas as pd import matplotlib.pyplot as plt # 原始数据 pn = [0.70604173074, 0.7019483995600001, 0.70271586578, 0.6977801500400002] tc = [0.49288115891999995, 0.7288539852599999, 0.6258675808399999, 0.33007094978000007, 0.45538473337999996, 0.5849680367, 0.5151045102999999, 0.78011459304, 0.52564381038] pc = [0.6286486934200001, 0.6450898248599999, 0.45266545178, 0.54746642074, 0.36717567197999995, 0.6974179308799999] tn = [0.7776927921000001, 0.7845524455400001] # 转换为Seaborn适配的长表格 data_list = [] for category, values in zip(["pn", "tc", "pc", "tn"], [pn, tc, pc, tn]): for val in values: data_list.append({"category": category, "value": val}) df = pd.DataFrame(data_list) # 绘图逻辑 plt.figure(figsize=(6, 4)) # 先绘制箱线图,关闭自带离群点避免和散点重复 sns.boxplot(x="category", y="value", data=df, width=0.3, fliersize=0) # 叠加stripplot散点,jitter控制同分类下散点横向抖动幅度 sns.stripplot(x="category", y="value", data=df, size=6, color="black", jitter=0.1) # 固定Y轴范围为0~1 plt.ylim(0, 1) # 展示图表 plt.show()
可调整参数说明
- 散点大小通过
stripplot的size参数控制 - 同分类散点的分散程度通过
jitter参数调整,值越大散点越分散 - 箱线图的宽度通过
boxplot的width参数调整
内容的提问来源于stack exchange,提问作者Dolev
相关产品推荐
相关产品推荐

