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

基于配对分组着色并支持自定义排序的箱线图实现方案问询

配对分组实验数据可视化优化方案

问题背景

我有按配对分组的实验数据,示例结构如下:

mydata = {
    "WT_before": [11,12,13],
    "WT_after": [16,17,18],
    "MRE11_before": [21,22,23,24,25],
    "MRE11_after": [26,27,28,29,30],
    "NBS1_before": [31,32,33,34],
    "NBS1_after": [36,37,38,39]
}

目前用Matplotlib绘制箱线图的代码如下,但存在排序不灵活、配色繁琐的问题:

bxplt_labels, bxplt_data = mydata.keys(), mydata.values()
bxplt_colors = ["pink", "pink", "lightgreen", "lightgreen", "lightblue", "lightblue"]

fig2, ax = plt.subplots(figsize=(20, 10), dpi=500)
bplot = plt.boxplot(bxplt_data, vert=False, showfliers=False, notch=False, patch_artist=True,)
for patch, color in zip(bplot['boxes'], bxplt_colors):
    patch.set_facecolor(color)
plt.yticks(range(1, len(bxplt_labels) + 1), bxplt_labels)
fig2.show()

需求

  • 自定义排序条件名称,可按需调整顺序;
  • 采用更优雅的配色方案,便于复用数据绘制其他图表(如每组前后散点图)。

优化方案

1. 转换为整洁数据结构

将原字典转换为整洁格式DataFrame,拆分出组别和时间点字段,这是实现灵活排序和统一可视化的基础:

import pandas as pd

data_list = []
for key, values in mydata.items():
    # 拆分键名得到组别和时间点
    group, time_point = key.split('_')
    for val in values:
        data_list.append({'组别': group, '时间点': time_point, '数值': val})
df = pd.DataFrame(data_list)

# 设置自定义排序顺序(可随时修改)
custom_group_order = ['MRE11', 'WT', 'NBS1']
# 将组别列设置为分类类型,锁定排序
df['组别'] = pd.Categorical(df['组别'], categories=custom_group_order, ordered=True)

2. 用Seaborn实现优雅配色与灵活排序

Seaborn能自动关联配色和分组,且继承DataFrame的排序规则,代码更简洁易维护:

import seaborn as sns
import matplotlib.pyplot as plt

# 生成可复用的配色方案(husl色系色彩区分度高,适合科研图表)
palette = sns.color_palette("husl", n_colors=len(custom_group_order))
# 建立组别与颜色的映射关系,方便跨图表复用
group_color_map = dict(zip(custom_group_order, palette))

# 绘制横向箱线图
plt.figure(figsize=(20, 10), dpi=500)
sns.boxplot(
    data=df,
    x='数值', y='组别', hue='时间点',
    showfliers=False, notch=False,
    # 为同一组别的前后时间点分配相同颜色
    palette={'before': group_color_map, 'after': group_color_map}
)
plt.title('配对分组箱线图')
plt.show()

3. 复用配色绘制散点图示例

基于同一配色映射,快速绘制其他类型图表:

plt.figure(figsize=(12, 8), dpi=300)
sns.stripplot(
    data=df,
    x='数值', y='组别', hue='时间点',
    palette={'before': group_color_map, 'after': group_color_map},
    jitter=True, alpha=0.7  # 添加抖动避免点重叠
)
plt.title('配对分组散点图')
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:21:12