function h = PlotBTN(G, strategy_colors, Spe_strategy, Spe_MB_behavior, varargin)
% PLOTBTN 绘制图G，支持指定颜色、标签颜色和强制节点坐标。
%
% 强制定点坐标：通过 varargin 传入 'fixedX', X_vector, 'fixedY', Y_vector
% 可以覆盖 plot 函数默认计算的布局坐标。
%
% 输入:
%   G:                      MATLAB graph 对象。
%   strategy_colors:        颜色矩阵，用于 NodeColor。
%   Spe_strategy:           标量，索引 strategy_colors 确定绘图颜色。
%   Spe_MB_behavior:        节点行为向量，用于确定节点大小。
%   varargin:               可选参数，包括：
%       'Color':            覆盖默认的节点颜色 (可选)。
%       'LabelColor':       [N x 3] 矩阵，指定节点标签的颜色。
%       'fixedX':           [N x 1] 向量，强制指定节点的 X 坐标。
%       'fixedY':           [N x 1] 向量，强制指定节点的 Y 坐标。

    % 1. 解析输入参数
    p = inputParser;
    
    % 保持原有的可选位置参数 (不指定名称，按顺序)
    addOptional(p, 'Color', strategy_colors(Spe_strategy, :)); 
    
    % 新增键值对参数
    addParameter(p, 'LabelColor', []); 
    addParameter(p, 'fixedX', []);      % 新增：强制X坐标
    addParameter(p, 'fixedY', []);      % 新增：强制Y坐标
    
    parse(p, varargin{:});
    
    colortouse = p.Results.Color;
    lblColors = p.Results.LabelColor;
    fixedX = p.Results.fixedX;
    fixedY = p.Results.fixedY;

    % 2. 绘图并初始化全局属性
    % 保持默认布局，以便 h.XData 和 h.YData 被初始化
    h = plot(G, 'Layout', 'force', 'EdgeColor', 'k', 'EdgeAlpha', 0.8);
    
    % *** 2.1 强制指定节点位置 (改进部分) ***
    if ~isempty(fixedX) && ~isempty(fixedY)
        % 检查坐标向量长度是否匹配节点数
        if numel(fixedX) == numnodes(G) && numel(fixedY) == numnodes(G)
            h.XData = fixedX; % 覆盖图对象内部的 X 坐标
            h.YData = fixedY; % 覆盖图对象内部的 Y 坐标
        else
            warning('PlotBTN:CoordMismatch', '提供的 fixedX/fixedY 长度与节点数不匹配，忽略固定坐标。');
        end
    end
    
    % 3. 向量化设置节点外观
    nodeSizes = repmat(2, numnodes(G), 1);
    % 假设 Spe_MB_behavior > 0 代表需要更大的节点
    nodeSizes(Spe_MB_behavior > 0) = 6;
    
    % 批量设置属性，并默认清空自带标签 (NodeLabel = {}) 以便后续自定义
    set(h, 'MarkerSize', nodeSizes, 'NodeColor', colortouse, 'NodeLabel', {});

    % 4. 根据 LabelColor 显示特定ID (如果存在)
    if ~isempty(lblColors)
        % 找出非 [nan, nan, nan] 的节点索引
        validIdx = find(~all(isnan(lblColors), 2));
        
        % 使用 text 函数绘制带颜色的标签
        % 注意：GraphPlot 不支持 NodeLabelColor 的向量化，必须用 text 实现
        for i = validIdx'
            text(h.XData(i), h.YData(i), string(i), ...
                 'Color', lblColors(i, :), ...
                 'VerticalAlignment', 'bottom', ... 
                 'HorizontalAlignment', 'left', ...
                 'FontSize', 8, 'FontWeight', 'bold');
        end
    end
end