基于配对分组着色并支持自定义排序的箱线图实现方案问询
配对分组实验数据可视化优化方案
问题背景
我有按配对分组的实验数据,示例结构如下:
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
相关产品推荐
相关产品推荐

