ProcessTime
Pressure(mT)
WaveMode
PulseFrequency(Hz)
SRFState1PulseDutyCycle(%)
SRFState2PulseDutyCycle(%)
SRFState3PulseDutyCycle(%)
BRFState1PulseDutyCycle(%)
BRFState2PulseDutyCycle(%)
BRFState3PulseDutyCycle(%)
BRF2MState1PulseDutyCycle(%)
BRF2MState2PulseDutyCycle(%)
BRF2MState3PulseDutyCycle(%)
BRFDelayDutyCycle(%)
BRF2MDelayDutyCycle(%)
SRFtoBRFdelay(s)
SRFRegulationMode
SRFState2RegulationMode
SRFState3RegulationMode
SRFState4RegulationMode
SRFPower(W)
SRFState2Power(W)
SRFState3Power(W)
SRFState4Power(W)
SRFMatchTuneState
SRFFrequencyMode
SRFMatchCurrentMode
SRFMatchCurrentRatio
SRFMatchC1TuneMode
SRFMatchC2TuneMode
SRFMatchC3TuneMode
SRFMatchC4TuneMode
SRFMatchC1Preset
SRFMatchC2Preset
SRFMatchC3Preset
SRFMatchC4Preset
SRFMatchPriorTimeTuneRatio
SRFState1PriorTimeTuneRatio
SRFState2PriorTimeTuneRatio
SRFState3PriorTimeTuneRatio
SRFState4PriorTimeTuneRatio
SRFReverseC3LowOffset
SRFStandardC3HighOffset
SRFState1PowerRamp
SRFState1PowerRampUp(W/s)
SRFState1PowerRampDown(W/s)
SRFState2PowerRamp
SRFState2RampUp(W/s)
SRFState2RampDown(W/s)
SRFState3PowerRamp
SRFState3RampUp(W/s)
SRFState3RampDown(W/s)
SRFState4PowerRamp
SRFState4RampUp(W/s)
SRFState4RampDown(W/s)
SRFBTB
SRFState1FrequencyPreset(kHz)
SRFState2FrequencyPreset(kHz)
SRFState3FrequencyPreset(kHz)
SRFState4FrequencyPreset(kHz)
SRFState1FrequencyTuneDelay(ms)
SRFState2FrequencyTuneDelay(ms)
SRFState3FrequencyTuneDelay(ms)
SRFState4FrequencyTuneDelay(ms)
SRFState1FrequencyRampTime(ms)
SRFState2FrequencyRampTime(ms)
SRFState3FrequencyRampTime(ms)
SRFState4FrequencyRampTime(ms)
SRFMBAMode
SRFState1ReferenceAngle(deg)
SRFState2ReferenceAngle(deg)
SRFState3ReferenceAngle(deg)
SRFState4ReferenceAngle(deg)
SRFState1MBALoopCoefficient
SRFState2MBALoopCoefficient
SRFState3MBALoopCoefficient
SRFState4MBALoopCoefficient
SRFState1DetuneAngle(deg)
SRFState2DetuneAngle(deg)
SRFState3DetuneAngle(deg)
SRFState4DetuneAngle(deg)
SRFState1MBAGammaThreshold
SRFState2MBAGammaThreshold
SRFState3MBAGammaThreshold
SRFState4MBAGammaThreshold
SRFState1MBAGammaReferencePoint
SRFState2MBAGammaReferencePoint
SRFState3MBAGammaReferencePoint
SRFState4MBAGammaReferencePoint
BRFControlMode
BRFState1RegulationMode
BRFState2RegulationMode
BRFState3RegulationMode
BRFState4RegulationMode
BRFPower(W)
BRFState2Power(W)
BRFState3Power(W)
BRFState4Power(W)
BRFState1Voltage(V)
BRFState2Voltage(V)
BRFState3Voltage(V)
BRFState4Voltage(V)
BRFMatchTuneState
BRFFrequencyMode
BRFMatchC1TuneMode
BRFMatchC2TuneMode
BRFMatchC1Preset
BRFMatchC2Preset
BRFMatchPriorTimeTuneRatio
BRFState1PriorTimeTuneRatio
BRFState2PriorTimeTuneRatio
BRFState3PriorTimeTuneRatio
BRFState4PriorTimeTuneRatio
BRFPulsegammaTarget
BRFPulsegammaRetune
BRFState1PowerRamp
BRFState1PowerRampUp(W/s)
BRFState1PowerRampDown(W/s)
BRFState2PowerRamp
BRFState2RampUp(W/s)
BRFState2RampDown(W/s)
BRFState3PowerRamp
BRFState3RampUp(W/s)
BRFState3RampDown(W/s)
BRFState4PowerRamp
BRFState4RampUp(W/s)
BRFState4RampDown(W/s)
BRFState1VoltageRamp
BRFState1VoltageRampUp(V/s)
BRFState1VoltageRampDown(V/s)
BRFState2VoltageRamp
BRFState2VoltageRampUp(V/s)
BRFState2VoltageRampDown(V/s)
BRFState3VoltageRamp
BRFState3VoltageRampUp(V/s)
BRFState3VoltageRampDown(V/s)
BRFState4VoltageRamp
BRFState4VoltageRampUp(V/s)
BRFState4VoltageRampDown(V/s)
BRFBTB
BRFState1FrequencyPreset(kHz)
BRFState2FrequencyPreset(kHz)
BRFState3FrequencyPreset(kHz)
BRFState4FrequencyPreset(kHz)
BRFState1FrequencyTuneDelay(ms)
BRFState2FrequencyTuneDelay(ms)
BRFState3FrequencyTuneDelay(ms)
BRFState4FrequencyTuneDelay(ms)
BRFState1FrequencyRampTime(ms)
BRFState2FrequencyRampTime(ms)
BRFState3FrequencyRampTime(ms)
BRFState4FrequencyRampTime(ms)
BRFMBAMode
BRFState1ReferenceAngle(deg)
BRFState2ReferenceAngle(deg)
BRFState3ReferenceAngle(deg)
BRFState4ReferenceAngle(deg)
BRFState1MBALoopCoefficient
BRFState2MBALoopCoefficient
BRFState3MBALoopCoefficient
BRFState4MBALoopCoefficient
BRFState1DetuneAngle(deg)
BRFState2DetuneAngle(deg)
BRFState3DetuneAngle(deg)
BRFState4DetuneAngle(deg)
BRFState1MBAGammaThreshold
BRFState2MBAGammaThreshold
BRFState3MBAGammaThreshold
BRFState4MBAGammaThreshold
BRFState1MBAGammaReferencePoint
BRFState2MBAGammaReferencePoint
BRFState3MBAGammaReferencePoint
BRFState4MBAGammaReferencePoint
BRF2MControlMode
BRF2MState1RegulationMode
BRF2MState2RegulationMode
BRF2MState3RegulationMode
BRF2MState4RegulationMode
BRF2MPower(W)
BRF2MState2Power(W)
BRF2MState3Power(W)
BRF2MState4Power(W)
BRF2MState1Voltage(V)
BRF2MState2Voltage(V)
BRF2MState3Voltage(V)
BRF2MState4Voltage(V)
BRF2MMatchTuneState
BRF2MFrequencyMode
BRF2MMatchC1TuneMode
BRF2MMatchC2TuneMode
BRF2MMatchC1Preset
BRF2MMatchC2Preset
BRF2MMatchPriorTimeTuneRatio
BRF2MState1PriorTimeTuneRatio
BRF2MState2PriorTimeTuneRatio
BRF2MState3PriorTimeTuneRatio
BRF2MState4PriorTimeTuneRatio
BRF2MPulsegammaTarget
BRF2MPulsegammaRetune
BRF2MState1PowerRamp
BRF2MState1PowerRampUp(W/s)
BRF2MState1PowerRampDown(W/s)
BRF2MState2PowerRamp
BRF2MState2RampUp(W/s)
BRF2MState2RampDown(W/s)
BRF2MState3PowerRamp
BRF2MState3RampUp(W/s)
BRF2MState3RampDown(W/s)
BRF2MState4PowerRamp
BRF2MState4RampUp(W/s)
BRF2MState4RampDown(W/s)
BRF2MState1VoltageRamp
BRF2MState1VoltageRampUp(V/s)
BRF2MState1VoltageRampDown(V/s)
BRF2MState2VoltageRamp
BRF2MState2VoltageRampUp(V/s)
BRF2MState2VoltageRampDown(V/s)
BRF2MState3VoltageRamp
BRF2MState3VoltageRampUp(V/s)
BRF2MState3VoltageRampDown(V/s)
BRF2MState4VoltageRamp
BRF2MState4VoltageRampUp(V/s)
BRF2MState4VoltageRampDown(V/s)
BRF2MBTB
BRF2MState1FrequencyPreset(kHz)
BRF2MState2FrequencyPreset(kHz)
BRF2MState3FrequencyPreset(kHz)
BRF2MState4FrequencyPreset(kHz)
BRF2MState1FrequencyTuneDelay(ms)
BRF2MState2FrequencyTuneDelay(ms)
BRF2MState3FrequencyTuneDelay(ms)
BRF2MState4FrequencyTuneDelay(ms)
BRF2MState1FrequencyRampTime(ms)
BRF2MState2FrequencyRampTime(ms)
BRF2MState3FrequencyRampTime(ms)
BRF2MState4FrequencyRampTime(ms)
BRF2MMBAMode
BRF2MState1ReferenceAngle(deg)
BRF2MState2ReferenceAngle(deg)
BRF2MState3ReferenceAngle(deg)
BRF2MState4ReferenceAngle(deg)
BRF2MState1MBALoopCoefficient
BRF2MState2MBALoopCoefficient
BRF2MState3MBALoopCoefficient
BRF2MState4MBALoopCoefficient
BRF2MState1DetuneAngle(deg)
BRF2MState2DetuneAngle(deg)
BRF2MState3DetuneAngle(deg)
BRF2MState4DetuneAngle(deg)
BRF2MState1MBAGammaThreshold
BRF2MState2MBAGammaThreshold
BRF2MState3MBAGammaThreshold
BRF2MState4MBAGammaThreshold
BRF2MState1MBAGammaReferencePoint
BRF2MState2MBAGammaReferencePoint
BRF2MState3MBAGammaReferencePoint
BRF2MState4MBAGammaReferencePoint
SiCl4
SiCl4mode
BCl3
BCl3mode
CO2
CO2mode
Heb
Hebmode
O2Low
O2Lowmode
O2High
O2Highmode
N2
N2mode
Ar
Armode
C4F6Low
C4F6Lowmode
NF3Low
NF3Lowmode
NF3High
NF3Highmode
SF6
SF6mode
CF4
CF4mode
C4F8
C4F8mode
CHF3
CHF3mode
SO2
SO2mode
HBr
HBrmode
Cl2
Cl2mode
CH2F2
CH2F2mode
He
Hemode
COS
COSmode
CH3F
CH3Fmode
CH4
CH4mode
H2
H2mode
C4F6High
C4F6Highmode
STGModeEnable
TuningGasMode
CenterTuneGas(%)
MiddleTuneGas(%)
EdgeTuneGas(%)
InnerESCTemp(degC)
MidInnerESCTemp(degC)
MidOuterESCTemp(degC)
OuterESCTemp(degC)
EndMode
EPDType
EPDConfig
SingleStepStop
MinEPDTime
MaxEPDTime
Oetch(percent)
EPDParameterD1
EPDParameterD2
HePressure(T)
VATCtlMode
VATPosPreset
VATPosDelayTime
WinTemp(degC)
GroundingRelay
WaferCooling
PulseCycle
Pulse
RampCycle
CenterlineEnable
ESCTempCalibration_Step
TrimTimeEnable
RFPA

# ---------------------- 核心批量绘图函数 ----------------------
def batch_plot_scatter(
    df: pd.DataFrame,
    plot_configs: list,
    save_dir: str = "matplotlib_scatter_plots",
    colors: list = ["#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd"]
) -> None:
    """
    批量绘制散点图(带XY轴线分隔象限,Matplotlib引擎)
    
    参数说明:
    ----------
    df : pd.DataFrame
        原始数据框
    plot_configs : list
        绘图配置列表,每个元素格式:(X轴参数, Y轴参数, 筛选base_id, [额外筛选参数列表])
        示例:[("ΔCarbonremain", "distance", "全部", []), ...]
    save_dir : str
        图片保存目录(默认:matplotlib_scatter_plots)
    colors : list
        散点配色列表(默认提供5种,不足会循环使用)
    """
    # 初始化样式
    init_matplotlib_style()
    
    # 创建保存目录
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)
    
    # 遍历配置批量绘图
    for idx, (x_col, y_col, base_id, extra_params) in enumerate(plot_configs, 1):
        # 1. 数据过滤逻辑
        temp_df = df.copy()
        
        # 筛选base_id
        if base_id != "全部":
            temp_df = temp_df[temp_df["base_id"] == base_id]
        
        # 筛选X轴非0
        temp_df = temp_df[temp_df[x_col] != 0]
        
        # 筛选多个额外参数(所有参数非0)
        if extra_params:
            for param in extra_params:
                if param not in temp_df.columns:
                    raise ValueError(f"额外筛选参数「{param}」不在数据列中!")
                temp_df = temp_df[temp_df[param] != 0]
        
        # 空数据跳过
        if temp_df.empty:
            print(f"⚠️ 第{idx}张图:筛选后无数据,跳过绘图")
            continue
        
        # 2. 初始化画布
        fig, ax = plt.subplots()
        
        # 核心:添加XY轴线(0点)分隔象限
        ax.axhline(y=0, color='black', linestyle='-', linewidth=1.2, alpha=0.8, label='Y=0')
        ax.axvline(x=0, color='black', linestyle='-', linewidth=1.2, alpha=0.8, label='X=0')
        
        # 3. 绘制散点图(颜色循环使用)
        color = colors[(idx-1) % len(colors)]
        scatter = ax.scatter(
            x=temp_df[x_col],
            y=temp_df[y_col],
            color=color,
            s=80,                # 点大小
            alpha=0.8,           # 透明度
            edgecolors="black",  # 点边框
            linewidths=0.5       # 边框宽度
        )
        
        # 4. 悬浮标注功能
        def hover(event):
            if event.inaxes == ax:
                cont, ind = scatter.contains(event)
                if cont:
                    idx_point = ind["ind"][0]
                    x_val = temp_df.iloc[idx_point][x_col]
                    y_val = temp_df.iloc[idx_point][y_col]
                    base_id_val = temp_df.iloc[idx_point]["base_id"]
                    # 绘制标注
                    ax.annotate(
                        f"{x_col}: {x_val}\n{y_col}: {y_val}\nbase_id: {base_id_val}",
                        xy=(x_val, y_val),
                        xytext=(5, 5),
                        textcoords="offset points",
                        bbox=dict(boxstyle="round,pad=0.3", fc="white", ec="gray", alpha=0.8),
                        fontsize=8
                    )
                    fig.canvas.draw_idle()
                else:
                    # 清空标注,重新绘制基础图
                    ax.clear()
                    # 重新绘制轴线
                    ax.axhline(y=0, color='black', linestyle='-', linewidth=1.2, alpha=0.8)
                    ax.axvline(x=0, color='black', linestyle='-', linewidth=1.2, alpha=0.8)
                    # 重新绘制散点
                    ax.scatter(temp_df[x_col], temp_df[y_col], color=color, s=80, alpha=0.8, edgecolors="black", linewidths=0.5)
                    ax.set_xlabel(x_col)
                    ax.set_ylabel(y_col)
                    ax.set_title(title)
                    ax.grid(True, alpha=0.3)
                    fig.canvas.draw_idle()
        
        # 绑定悬浮事件
        fig.canvas.mpl_connect("motion_notify_event", hover)
        
        # 5. 图表标题/标签
        extra_params_str = "、".join(extra_params) if extra_params else "无"
        title = f"图{idx}:{x_col} vs {y_col}\n(base_id={base_id},额外筛选参数={extra_params_str})"
        ax.set_title(title, fontsize=12, pad=15)
        ax.set_xlabel(x_col, fontsize=10)
        ax.set_ylabel(y_col, fontsize=10)
        
        # 6. 保存图片(300DPI高清)
        save_filename = f"散点图{idx}_{x_col}_vs_{y_col}.png"
        save_path = os.path.join(save_dir, save_filename)
        plt.tight_layout()  # 自动调整布局
        plt.savefig(save_path, dpi=300, bbox_inches="tight")
        
        # 7. 显示图片并打印日志
        print(f"========== 显示第{idx}张图 ==========")
        plt.show()
        print(f"✅ 第{idx}张图已保存至:{save_path}\n")
        
        # 关闭画布释放内存
        plt.close(fig)

image

import pandas as pd
import matplotlib.pyplot as plt
import os
import warnings
warnings.filterwarnings("ignore")  # 忽略无关警告

# ---------------------- 全局样式初始化函数 ----------------------
def init_matplotlib_style():
    """初始化Matplotlib全局样式(支持中文、网格、高清等)"""
    plt.rcParams["font.sans-serif"] = ["SimHei"]  # Windows中文
    # plt.rcParams["font.sans-serif"] = ["Arial Unicode MS"]  # Mac中文(按需切换)
    plt.rcParams["axes.unicode_minus"] = False    # 支持负号
    plt.rcParams["figure.figsize"] = (10, 6)      # 默认画布大小
    plt.rcParams["dpi"] = 150                     # 显示分辨率
    plt.rcParams["axes.grid"] = True              # 显示网格
    plt.rcParams["grid.alpha"] = 0.3              # 网格透明度

# ---------------------- 核心批量绘图函数 ----------------------
def batch_plot_scatter(
    df: pd.DataFrame,
    plot_configs: list,
    save_dir: str = "matplotlib_scatter_plots",
    colors: list = ["#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd"]
) -> None:
    """
    批量绘制散点图(带XY轴线分隔象限,支持每个图表独立设置distance筛选)
    
    参数说明:
    ----------
    df : pd.DataFrame
        原始数据框
    plot_configs : list
        绘图配置列表,每个元素格式:
        (X轴参数, Y轴参数, 筛选base_id, [额外筛选参数列表], distance区间)
        distance区间格式:(最小值, 最大值) 或 None(不筛选)
        示例:[("ΔCarbonremain", "distance", "全部", [], (0, 100)), ...]
    save_dir : str
        图片保存目录(默认:matplotlib_scatter_plots)
    colors : list
        散点配色列表(默认提供5种,不足会循环使用)
    """
    # 初始化样式
    init_matplotlib_style()
    
    # 创建保存目录
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)
    
    # 遍历配置批量绘图
    for idx, config in enumerate(plot_configs, 1):
        # 解析配置参数(兼容旧配置格式)
        if len(config) == 4:
            x_col, y_col, base_id, extra_params = config
            distance_range = None
        elif len(config) == 5:
            x_col, y_col, base_id, extra_params, distance_range = config
        else:
            raise ValueError(f"第{idx}个配置格式错误!应包含4-5个参数:(X轴, Y轴, base_id, 额外参数列表, distance区间)")
        
        # 1. 数据过滤逻辑
        temp_df = df.copy()
        
        # 筛选base_id
        if base_id != "全部":
            temp_df = temp_df[temp_df["base_id"] == base_id]
        
        # distance区间筛选(每个图表独立配置)
        if distance_range is not None and "distance" in temp_df.columns:
            min_dist, max_dist = distance_range
            temp_df = temp_df[(temp_df["distance"] >= min_dist) & (temp_df["distance"] <= max_dist)]
            print(f"🔍 第{idx}张图:筛选distance在[{min_dist}, {max_dist}]区间内的数据")
        
        # 筛选X轴非0
        temp_df = temp_df[temp_df[x_col] != 0]
        
        # 筛选多个额外参数(所有参数非0)
        if extra_params:
            for param in extra_params:
                if param not in temp_df.columns:
                    raise ValueError(f"额外筛选参数「{param}」不在数据列中!")
                temp_df = temp_df[temp_df[param] != 0]
        
        # 空数据跳过
        if temp_df.empty:
            print(f"⚠️ 第{idx}张图:筛选后无数据,跳过绘图")
            continue
        
        # 2. 初始化画布
        fig, ax = plt.subplots()
        
        # 核心:添加XY轴线(0点)分隔象限
        ax.axhline(y=0, color='black', linestyle='-', linewidth=1.2, alpha=0.8)
        ax.axvline(x=0, color='black', linestyle='-', linewidth=1.2, alpha=0.8)
        
        # 3. 绘制散点图(颜色循环使用)
        color = colors[(idx-1) % len(colors)]
        scatter = ax.scatter(
            x=temp_df[x_col],
            y=temp_df[y_col],
            color=color,
            s=80,                # 点大小
            alpha=0.8,           # 透明度
            edgecolors="black",  # 点边框
            linewidths=0.5       # 边框宽度
        )
        
        # 4. 悬浮标注功能
        def hover(event):
            if event.inaxes == ax:
                cont, ind = scatter.contains(event)
                if cont:
                    idx_point = ind["ind"][0]
                    x_val = temp_df.iloc[idx_point][x_col]
                    y_val = temp_df.iloc[idx_point][y_col]
                    base_id_val = temp_df.iloc[idx_point]["base_id"]
                    dist_val = temp_df.iloc[idx_point]["distance"]
                    # 绘制标注(增加distance显示)
                    ax.annotate(
                        f"{x_col}: {x_val}\n{y_col}: {y_val}\nbase_id: {base_id_val}\ndistance: {dist_val}",
                        xy=(x_val, y_val),
                        xytext=(5, 5),
                        textcoords="offset points",
                        bbox=dict(boxstyle="round,pad=0.3", fc="white", ec="gray", alpha=0.8),
                        fontsize=8
                    )
                    fig.canvas.draw_idle()
                else:
                    # 清空标注,重新绘制基础图
                    ax.clear()
                    # 重新绘制轴线
                    ax.axhline(y=0, color='black', linestyle='-', linewidth=1.2, alpha=0.8)
                    ax.axvline(x=0, color='black', linestyle='-', linewidth=1.2, alpha=0.8)
                    # 重新绘制散点
                    ax.scatter(temp_df[x_col], temp_df[y_col], color=color, s=80, alpha=0.8, edgecolors="black", linewidths=0.5)
                    ax.set_xlabel(x_col)
                    ax.set_ylabel(y_col)
                    ax.set_title(title)
                    ax.grid(True, alpha=0.3)
                    fig.canvas.draw_idle()
        
        # 绑定悬浮事件
        fig.canvas.mpl_connect("motion_notify_event", hover)
        
        # 5. 图表标题/标签(增加distance筛选信息)
        extra_params_str = "、".join(extra_params) if extra_params else "无"
        dist_filter_str = f",distance∈{distance_range}" if distance_range else ""
        title = f"图{idx}:{x_col} vs {y_col}\n(base_id={base_id}{dist_filter_str},额外筛选参数={extra_params_str})"
        ax.set_title(title, fontsize=12, pad=15)
        ax.set_xlabel(x_col, fontsize=10)
        ax.set_ylabel(y_col, fontsize=10)
        
        # 6. 保存图片(300DPI高清)
        save_filename = f"散点图{idx}_{x_col}_vs_{y_col}.png"
        save_path = os.path.join(save_dir, save_filename)
        plt.tight_layout()  # 自动调整布局
        plt.savefig(save_path, dpi=300, bbox_inches="tight")
        
        # 7. 显示图片并打印日志
        print(f"========== 显示第{idx}张图 ==========")
        print(f"📊 筛选后有效数据量:{len(temp_df)}条")
        plt.show()
        print(f"✅ 第{idx}张图已保存至:{save_path}\n")
        
        # 关闭画布释放内存
        plt.close(fig)

# ---------------------- 函数调用示例 ----------------------
if __name__ == "__main__":
    # 1. 准备数据(替换为你的真实数据)
    data = {
        "ΔCarbonremain": [84, -124, 200, -416, 60, 182, 18, 147, 253, 120, 193, -238, 168, 92, 41],
        "distance": [2,3,33,61,4,3,5,4,3,5,122,67,3,121,121],
        "change_num": [2,3,33,61,4,3,5,4,3,5,122,67,3,121,121],
        "base_id": ["XSW-N4-CH-R33"]*15,
        "ΔDep3#SRFPower(W)": [10, 0, 20, 0, 15, 0, 8, 9, 0, 12, 18, 0, 7, 11, 14],
        "ΔDep3#Pressure(m)": [5, 0, 8, 0, 6, 0, 4, 7, 0, 9, 10, 0, 3, 8, 6]
    }
    df = pd.DataFrame(data)
    
    # 2. 定义绘图配置(每个图表独立设置distance筛选区间)
    plot_configs = [
        # (X轴参数, Y轴参数, 筛选base_id, [额外筛选参数列表], distance区间)
        ("ΔCarbonremain", "distance", "全部", [], (0, 50)),          # distance筛选0-50
        ("ΔCarbonremain", "change_num", "全部", ["ΔDep3#SRFPower(W)"], (0, 100)),  # distance筛选0-100
        ("ΔDep3#SRFPower(W)", "distance", "XSW-N4-CH-R33", [], None),     # 不筛选distance
        ("ΔCarbonremain", "ΔDep3#SRFPower(W)", "XSW-N4-CH-R33", ["distance", "ΔDep3#Pressure(m)"], (10, 80)),  # distance筛选10-80
        ("change_num", "distance", "全部", ["ΔCarbonremain", "ΔDep3#SRFPower(W)", "ΔDep3#Pressure(m)"], (50, 120))   # distance筛选50-120
    ]
    
    # 3. 调用函数批量绘图
    batch_plot_scatter(
        df=df,
        plot_configs=plot_configs,
        save_dir="my_scatter_plots",  # 自定义保存目录
        colors=["#FF6B6B", "#4ECDC4", "#45B7D1", "#96CEB4", "#FECA57"]  # 自定义配色
    )