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

如何用循环批量绘制DataFrame双列过滤后的Seaborn散点图?

批量绘制Seaborn散点图解决方案

问题背景

现有包含sheet、rep、sample、variable、value列的Pandas DataFrame,手动过滤sheet和variable列后用Seaborn的swarmplot绘图效率极低。尝试嵌套循环批量绘图时存在两个核心问题:

  • 未在数据过滤中加入variable条件,导致绘图数据不符合预期
  • 不同sheet对应的variable存在差异(如QG1IP有mass变量,AB0无),循环全局所有variable会产生大量无效绘图

问题分析

原批量代码的缺陷:

  1. 直接遍历全局所有variable,未针对当前sheet筛选有效变量,造成无意义的循环
  2. 绘图时仅过滤sheet维度,未同时过滤variable,导致单图包含当前sheet下所有变量的混合数据

解决代码

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

# 初始化数据
data = {
    'sheet': ['AB0', 'AB0', 'AB0', 'AB0', 'AB0', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'AB0', 'AB0', 'AB0', 'AB0', 'AB0', 'AB0', 'AB0', 'AB0', 'AB0', 'AB0', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'AB0', 'AB0', 'AB0', 'AB0', 'AB0', 'AB0', 'AB0', 'AB0', 'AB0', 'AB0', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP', 'QG1IP'],
    'rep': [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5],
    'sample': ['AS9', 'AS9', 'AS9', 'AS9', 'AS9', 'AS9', 'AS9', 'AS9', 'AS9', 'AS9', 'AS9', 'AS9', 'AS9', 'AS9', 'AS9', 'AIO', 'AIO', 'AIO', 'AIO', 'AIO', 'AS9', 'AS9', 'AS9', 'AS9', 'AS9', 'AIO', 'AIO', 'AIO', 'AIO', 'AIO', 'AS9', 'AS9', 'AS9', 'AS9', 'AS9', 'AIO', 'AIO', 'AIO', 'AIO', 'AIO', 'AS9', 'AS9', 'AS9', 'AS9', 'AS9', 'AIO', 'AIO', 'AIO', 'AIO', 'AIO', 'AS9', 'AS9', 'AS9', 'AS9', 'AS9', 'AIO', 'AIO', 'AIO', 'AIO', 'AIO', 'AS9', 'AS9', 'AS9', 'AS9', 'AS9', 'AIO', 'AIO', 'AIO', 'AIO', 'AIO', 'AS9', 'AS9', 'AS9', 'AS9', 'AS9', 'AIO', 'AIO', 'AIO', 'AIO', 'AIO'],
    'variable': ['weight loss', 'weight loss', 'weight loss', 'weight loss', 'weight loss', 'weight loss', 'weight loss', 'weight loss', 'weight loss', 'weight loss', 'counts', 'counts', 'counts', 'counts', 'counts', 'counts', 'counts', 'counts', 'counts', 'counts', 'counts', 'counts', 'counts', 'counts', 'counts', 'counts', 'counts', 'counts', 'counts', 'counts', 'mandy', 'mandy', 'mandy', 'mandy', 'mandy', 'mandy', 'mandy', 'mandy', 'mandy', 'mandy', 'mass', 'mass', 'mass', 'mass', 'mass', 'mass', 'mass', 'mass', 'mass', 'mass', 'andy', 'andy', 'andy', 'andy', 'andy', 'andy', 'andy', 'andy', 'andy', 'andy', 'irene', 'irene', 'irene', 'irene', 'irene', 'irene', 'irene', 'irene', 'irene', 'irene', 'lee', 'lee', 'lee', 'lee', 'lee', 'lee', 'lee', 'lee', 'lee', 'lee'],
    'value': [11.0, 11.0, 10.0, 1.0, 11.0, 13.0, 0.6, 120.0, 110.0, 113.0, 12.3, 12.3, 12.3, 12.3, 12.3, 12.3, 12.3, 12.3, 12.3, 12.3, 12.3, 12.3, 12.3, 12.3, 12.3, 12.3, 12.3, 12.3, 12.3, 12.3, 3.4804, 5.6209999999999996, 5.851999999999999, 3.4804, 3.4804, 3.4804, 3.4804, 3.4804, 3.4804, 5.390000000000001, 2084.33734939759, 16.86746987951807, 1963.855421686747, 1771.0843373493974, 1819.2771084337348, 12.048192771084336, 12.048192771084336, 14.457831325301203, 4.819277108433735, 8.433734939759034, 195.0, 85.0, 102.5, 180.0, 60.75000000000001, 64.25, 90.83333333333334, 67.00000000000001, 93.33333333333334, 73.08333333333334, 237.89473684210526, 85.57894736842105, 44.10526315789474, 32.21052631578948, 21.68421052631579, 452.63157894736844, 56.52631578947369, 12.000000000000002, 101.36842105263158, 43.473684210526315, 2.3324399999999996, 1.07415, 2.3324399999999996, 1.07415, 1.07415, 2.3324399999999996, 1.07415, 1.07415, 2.3324399999999996, 1.07415]
}

df = pd.DataFrame(data)

# 批量绘制swarmplot
sheet_list = df['sheet'].unique().tolist()

for sheet in sheet_list:
    # 获取当前sheet下的唯一variable列表,避免无效循环
    sheet_vars = df[df['sheet'] == sheet]['variable'].unique().tolist()
    for variable in sheet_vars:
        # 同时过滤sheet和variable,获取目标数据
        plot_data = df.loc[(df['sheet'] == sheet) & (df['variable'] == variable)]
        plt.figure(figsize=(8,6))
        sns.swarmplot(data=plot_data, hue='sample', x='sample', y='value')
        plt.title(f"{sheet} {variable}")
        plt.subplots_adjust(bottom=0.3)
        plt.show()

关键改进点

  • 针对每个sheet单独提取其对应的有效variable列表,彻底避免对不存在的变量进行绘图
  • 绘图时同时过滤sheet和variable两个维度,确保每张图仅展示目标变量的纯净数据
  • 统一设置图的尺寸,优化可视化展示效果

内容的提问来源于stack exchange,提问作者Steve..Johnson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 22:32:50