解读x264_param_default

本文详细介绍了x264编码器的参数配置过程,包括内存分配、CPU检测、视频属性设置、编码参数调整、码率控制策略及日志记录等。通过对这些参数的理解与设置,可以帮助开发者更好地优化视频编码效果。

from:http://blog.youkuaiyun.com/maopig/article/details/6702656

void    x264_param_default( x264_param_t *param ) 
{

    /* 开辟内存空间*/

    memset( param, 0, sizeof( x264_param_t ) );      

 

    /* CPU自动检测 */

    param->cpu = x264_cpu_detect();

    param->i_threads = X264_THREADS_AUTO; /* 并行编码线程为0 */

    param->b_deterministic = 1; /*允许非确定性时线程优化*/

    param->i_sync_lookahead = X264_SYNC_LOOKAHEAD_AUTO;/* 自动选择线程超前缓冲大小-1 */

 

    /* 视频属性 */

    param->i_csp           = X264_CSP_I420; /*设置输入的视频采样的格式0x0001yuv 4:2:0 planar*/

    param->i_width         = 0; /* 宽度*/

    param->i_height        = 0; /* 高度*/

    param->vui.i_sar_width = 0;

    param->vui.i_sar_height= 0; /* 设置长宽比 */

    param->vui.i_overscan  = 0;  /* 过扫描线,默认undef(不设置),可选:show(观看)crop(去除) */

    param->vui.i_vidformat = 5;  /* undef视频格式 */

    param->vui.b_fullrange = 0;  /* off */

    param->vui.i_colorprim = 2;  /* undef原始色度格式*/

    param->vui.i_transfer  = 2;  /* undef 转换方式*/

    param->vui.i_colmatrix = 2;  /* undef 色度矩阵设置*/

    param->vui.i_chroma_loc= 0;  /* left center 色度样本指定,范围0~5,默认0*/

    param->i_fps_num       = 25; /*帧率*/
    param->i_fps_den       = 1; /*用两个整型的数的比值,来表示帧率*/

    param->i_level_idc     = -1; /* level值的设置*/

    param->i_slice_max_size = 0; /* 每片字节的最大数,包括预计的NAL开销. */

    param->i_slice_max_mbs = 0; /* 每片宏块的最大数,重写 i_slice_count */

    param->i_slice_count = 0; /* 每帧的像条数目: 设置矩形像条. */

 

    /* 编码参数 */

    param->i_frame_reference = 3; /*参考帧的最大帧数。*/

    param->i_keyint_max = 250; /* 在此间隔设置IDR关键帧 */

    param->i_keyint_min = 25; /* 场景切换少于次值编码位I, 而不是 IDR. */

    param->i_bframe = 3; /*两个参考帧之间的B帧数目*/

    param->i_scenecut_threshold = 40; /*如何积极地插入额外的I帧 */

    param->i_bframe_adaptive = X264_B_ADAPT_FAST; /*自适应B帧判定1*/

    param->i_bframe_bias = 0; /*控制插入B帧判定,范围-100~+100,越高越容易插入B帧*/

    param->b_bframe_pyramid = 0; /*允许部分B为参考帧 */

 

    param->b_deblocking_filter = 1; /*去块效应相关*/

    param->i_deblocking_filter_alphac0 = 0; /* [-6, 6] -6 亮度滤波器, 6 强 */

    param->i_deblocking_filter_beta = 0; /* [-6, 6]  同上 */

 

    param->b_cabac = 1; /*cabac的开关*/

    param->i_cabac_init_idc = 0;

   

/*码率控制*/

    param->rc.i_rc_method = X264_RC_CRF;;/*恒定码率*/

    param->rc.i_bitrate = 0;/*设置平均码率大小*/

    param->rc.f_rate_tolerance = 1.0;

    param->rc.i_vbv_max_bitrate = 0; /*平均码率模式下,最大瞬时码率,默认0(与-B设置相同) */

    param->rc.i_vbv_buffer_size = 0; /*码率控制缓冲区的大小,单位kbit,默认0 */

    param->rc.f_vbv_buffer_init = 0.9; /* <=1: fraction of buffer_size. >1: kbit码率控制缓冲区数据保留的最大数据量与缓冲区大小之比,范围0~1.0,默认0.9*/

    param->rc.i_qp_constant = 23;;/*最小qp值*/

    param->rc.f_rf_constant = 23;

    param->rc.i_qp_min = 10; /*允许的最小量化值 */

    param->rc.i_qp_max = 51; /*允许的最大量化值*/

    param->rc.i_qp_step = 4; /*帧间最大量化步长 */

    param->rc.f_ip_factor = 1.4;

    param->rc.f_pb_factor = 1.3;

    param->rc.i_aq_mode = X264_AQ_VARIANCE; /* psy adaptive QP. (X264_AQ_*) *//通过减少色度量化偏移量的方法来提高亮度的总体质量。adaptive QP.

    param->rc.f_aq_strength = 1.0;

    param->rc.i_lookahead = 40;

 

    param->rc.b_stat_write = 0; /* Enable stat writing in psz_stat_out */

    param->rc.psz_stat_out = "x264_2pass.log";

    param->rc.b_stat_read = 0;

    param->rc.psz_stat_in = "x264_2pass.log";

param->rc.f_qcompress = 0.6; /* 0.0 => cbr, 1.0 => constant qp */  

 param->rc.f_qblur = 0.5;   /*时间上模糊量化 */

    param->rc.f_complexity_blur = 20; /* 时间上模糊复杂性 */

    param->rc.i_zones = 0; /* number of zone_t's */

    param->rc.b_mb_tree = 1; /* Macroblock-tree ratecontrol. */

 

    /* 日志 */

    param->pf_log = x264_log_default;

    param->p_log_private = NULL;

    param->i_log_level = X264_LOG_INFO;/*默认为“Info”*/

 

    /*分析 */

    param->analyse.intra = X264_ANALYSE_I4x4 | X264_ANALYSE_I8x8;

    param->analyse.inter = X264_ANALYSE_I4x4 | X264_ANALYSE_I8x8

                         | X264_ANALYSE_PSUB16x16 | X264_ANALYSE_BSUB16x16;

    param->analyse.i_direct_mv_pred = X264_DIRECT_PRED_SPATIAL;/*空间预测模式*/

    param->analyse.i_me_method = X264_ME_HEX;/*运动估计算法HEX*/

    param->analyse.f_psy_rd = 1.0;

    param->analyse.b_psy = 1;

    param->analyse.f_psy_trellis = 0;

    param->analyse.i_me_range = 16;/*运动估计范围*/

    param->analyse.i_subpel_refine = 7; /* 亚像素运动估计质量 */

    param->analyse.b_mixed_references = 1; /*允许每个宏块的分区在P帧有它自己的参考号*/

    param->analyse.b_chroma_me = 1; /* 亚像素色度运动估计和P帧的模式选择 */

    param->analyse.i_mv_range_thread = -1; /* 线程之间的最小空间. -1 = auto, based on number of threads. */

    param->analyse.i_mv_range = -1; /*运动矢量最大长度set from level_idc*/

    param->analyse.i_chroma_qp_offset = 0; /*色度量化步长偏移量 */

    param->analyse.b_fast_pskip = 1; /*快速P帧跳过检测*/

    param->analyse.b_weighted_bipred = 1; /*为b帧隐式加权 */

    param->analyse.b_dct_decimate = 1; /* 在P-frames转换参数域 */

    param->analyse.b_transform_8x8 = 1; /* 帧间分区*/

    param->analyse.i_trellis = 1; /* Trellis量化,对每个8x8的块寻找合适的量化值,需要CABAC,默认0 0:关闭1:只在最后编码时使用2:一直使用*/

    param->analyse.i_luma_deadzone[0] = 21; /*帧间亮度量化中使用的无效区大小*/

    param->analyse.i_luma_deadzone[1] = 11; /*帧内亮度量化中使用的无效区大小*/

    param->analyse.b_psnr = 0;/*是否显示PSNR*/

    param->analyse.b_ssim = 0;/*是否显示SSIM*/

 

/*量化*/

    param->i_cqm_preset = X264_CQM_FLAT; /*自定义量化矩阵(CQM),初始化量化模式为flat 0*/

    memset( param->cqm_4iy, 16, 16 );

    memset( param->cqm_4ic, 16, 16 );

    memset( param->cqm_4py, 16, 16 );

    memset( param->cqm_4pc, 16, 16 );

    memset( param->cqm_8iy, 16, 64 );

    memset( param->cqm_8py, 16, 64 );/*开辟空间*/

    /*muxing*/

    param->b_repeat_headers = 1; /* 在每个关键帧前放置SPS/PPS*/

param->b_aud = 0; /*生成访问单元分隔符*/

}

for DRB_ID, lot_group in grouped: # 遍历每个参数 for param in lot_group['PARAMETER_MAPPING'].unique(): param_data = lot_group[lot_group['PARAMETER_MAPPING'] == param].copy() # 新增计算部分 overall_mean = param_data['VALUE'].mean() overall_std = param_data['VALUE'].std() upper_bound = overall_mean + 3 * overall_std lower_bound = overall_mean - 3 * overall_std # 生成坐标标签和颜色 # x_labels = [] conditions = [ param_data['WAFER_TYPE'] == 'DRB_WAFER', param_data['WAFER_TYPE'] == 'NONE_DRB_WAFER' ] choices = [ param_data['LOTNO'].astype(str) + '-' + param_data['WAFER_NO'].astype(str), param_data['LOTNO'].astype(str) + '-' + param_data['WAFER_NO'].astype(str) ] tick_labels = np.select(conditions, choices, default=param_data['WAFER_TYPE'].astype(str) + '-' + param_data['WAFER_NO'].astype(str)) # 将标签添加到数据中并按标签分组 param_data['x_label'] = tick_labels sorted_data = param_data.sort_values('MEASURE_TIME').copy() grouped_by_label = sorted_data.groupby('x_label', sort=False) labels = list(grouped_by_label.groups.keys()) data = [group['VALUE'].values for name, group in grouped_by_label if not group['VALUE'].empty] # 创建绘图 plt.figure(figsize=(20, 10)) boxplot = plt.boxplot( data, tick_labels=labels, patch_artist=True ) # 设置颜色 COLOR_MAP = { 'DRB_WAFER': '#66CDAA', 'NONE_DRB_WAFER': '#FFDEAD', 'default': '#B0C4DE' } for i, (name, group) in enumerate(grouped_by_label): wafer_type = group['WAFER_TYPE'].iloc[0] color = COLOR_MAP.get(wafer_type, COLOR_MAP['default']) boxplot['boxes'][i].set_facecolor(color) #mean+-3sigma plt.axhline(y=overall_mean, color='r', linestyle='-', linewidth=1,label='Mean') plt.axhline(y=upper_bound, color='r', linestyle='-', linewidth=1,label='mean+3σ') plt.axhline(y=lower_bound, color='r', linestyle='-', linewidth=1,label='mean-3σ') # 设置图表属性 plt.title(f"DRB_ID: {DRB_ID} - Parameter: {param}") plt.xticks(rotation=90) plt.grid(True) plt.ylim(auto=True) # 确保y轴自适应 将每个组的data中的所有点标识在图上,并且按照wafertype颜色添加图例
最新发布
03-15
<think>嗯,我现在需要帮助用户解决他们的Python代码问题。他们有一段代码,用来生成箱线图,并且想要在图上显示每个数据点,同时根据wafer_type的颜色添加图例。让我仔细看看他们的代码。 首先,用户的代码结构大概是这样的:他们按DRB_ID和lot_group分组,然后对每个参数进行处理。计算整体的均值和标准差,生成上下限。接着根据WAFER_TYPE生成标签,排序数据,然后分组画箱线图,设置颜色,添加均值线和3σ边界,最后设置图表属性。 用户的需求是:将每个组的data中的所有点标识在图上,并且按照wafertype颜色添加图例。现在,我需要想怎么在现有的代码基础上实现这一点。 首先,标识所有数据点。通常箱线图不显示所有点,但可以叠加散点图。每个数据点需要根据对应的wafer_type来着色。现有的代码中,箱线图的颜色已经根据wafer_type使用了COLOR_MAP,所以散点的颜色应该与之对应。 然后,添加图例。图例需要显示不同wafer_type对应的颜色,可能需要手动创建,因为自动图例可能无法直接关联到散点或箱线图的颜色。 现在,我需要考虑如何将数据点绘制到图上。在箱线图的每个位置(即每个x轴的位置),对应的数据点需要被绘制出来。例如,第一个箱线图对应x=1的位置,其数据点应该在x=1的位置上散布开,颜色根据wafer_type决定。 但如何获取每个数据点的x坐标呢?箱线图的x轴位置是按顺序排列的,每个箱线图对应一个位置。在代码中,data变量是每个分组的值的列表,而labels是分组的名称。所以,每个data[i]对应x=i+1的位置(因为Python的boxplot从x=1开始)。 因此,对于每个分组i,对应的x位置是i+1,然后将该组的所有数据点y值绘制在x=i+1的位置上,颜色根据wafer_type确定。 但如何确定每个分组的wafer_type呢?因为grouped_by_label是按x_label分组的,每个分组有一个wafer_type,可以通过group['WAFER_TYPE'].iloc[0]获取,这和箱线图颜色处理的方式一致。 所以,可以在画箱线图之后,遍历每个分组,获取其对应的x位置,然后在该x位置绘制散点,颜色使用对应的COLOR_MAP中的颜色。 具体来说,可能需要遍历grouped_by_label的每个组,确定该组在data中的索引,然后确定x坐标的位置。或者,在生成data列表的时候,保留对应的wafer_type信息。 或者,更简单的方式是,在生成data的时候,同时记录每个数据点的x坐标和颜色。例如,对于每个组i,x坐标是i+1,颜色由该组的wafer_type决定。 现在,用户现有的代码中,grouped_by_label是按x_label分组的,并且已经按顺序处理了每个组,生成data列表和labels。所以,在绘制散点时,每个组对应的x坐标就是其在data中的索引加1(因为plt.boxplot的x位置从1开始)。 因此,可以遍历每个组,确定该组的x位置,然后在该位置绘制散点。 例如: for i, (name, group) in enumerate(grouped_by_label): wafer_type = group['WAFER_TYPE'].iloc[0] color = COLOR_MAP.get(wafer_type, COLOR_MAP['default']) x_pos = i + 1 # 因为boxplot的x位置从1开始 y_values = group['VALUE'].values # 为了分散点,可以在x_pos周围添加一些随机抖动 jitter = np.random.normal(0, 0.1, size=len(y_values)) plt.scatter(x_pos + jitter, y_values, color=color, alpha=0.5, s=10) 这里,添加了随机抖动,避免点全部重叠在一条线上。同时,alpha设置透明度,s调整点的大小。 接下来是添加图例。由于不同的wafer_type有不同的颜色,需要为每个颜色创建一个图例句柄。可以手动创建图例条目,例如: from matplotlib.lines import Line2D legend_elements = [ Line2D([0], [0], marker='o', color='w', label='DRB_WAFER', markerfacecolor=COLOR_MAP['DRB_WAFER'], markersize=8), Line2D([0], [0], marker='o', color='w', label='NONE_DRB_WAFER', markerfacecolor=COLOR_MAP['NONE_DRB_WAFER'], markersize=8), Line2D([0], [0], marker='o', color='w', label='Other', markerfacecolor=COLOR_MAP['default'], markersize=8) ] plt.legend(handles=legend_elements, loc='best') 这样可以在图上添加图例,说明每种颜色对应的wafer_type。 现在,需要将这些代码整合到用户现有的代码中。具体来说,在绘制箱线图之后,添加散点图的绘制,然后添加图例。 需要注意,用户的代码中已经有一个plt.legend()用于均值线,但现在需要合并两个图例。或者,可能需要将均值线的标签和图例的wafer_type标签合并。 但原来的代码中,用户已经添加了三条水平线,并给它们设置了label='Mean'等,这可能导致图例中出现重复的问题。例如,如果用户调用plt.legend(),可能会显示均值线和散点的图例混合在一起,这可能不是用户想要的。 因此,可能需要处理图例的合并。或者,将均值线的标签和图例分开。 或者,在绘制散点的时候,不设置label,而是手动创建图例,只显示wafer_type的颜色。而均值线的图例可以单独处理。但这样可能需要更复杂的图例处理。 或者,用户可能希望所有的图例项都显示,包括均值和wafer_type。这可能需要将两者的句柄合并。 可能的解决方案: 1. 在绘制散点时,不设置label,而是手动创建图例条目,包括wafer_type的颜色和均值线的标签。 或者, 2. 在绘制均值线时,使用不同的label,然后合并所有图例句柄。 但这样可能会比较复杂。例如,用户原来的代码中,三个axhline都用了label参数,这会导致图例中出现三个重复的条目,因为每次调用axhline都会添加相同的label。例如,三个线都是红色,但标签分别是'Mean', 'mean+3σ', 'mean-3σ'。而散点的图例需要另外添加。 因此,正确的做法应该是: - 在绘制三条水平线时,为每条线分配不同的标签,然后收集这些线条的句柄,同时收集散点的颜色图例句柄,合并后添加到图例中。 或者,用户可能希望将均值线和wafer_type的图例分开显示。但通常,一个图例包含所有条目更好。 但处理起来可能比较麻烦,因此可能需要先绘制所有元素,然后收集所有需要的图例句柄和标签,最后统一创建图例。 不过,这可能超出了当前用户的需求范围。用户主要需要的是在图上显示所有数据点,并添加wafer_type的颜色图例。原来的均值线图例可能已经存在,但可能会有重复的问题。 现在,回到用户的问题,他们可能希望同时显示wafer_type的图例和均值线的图例。但原来的代码中,三个axhline都用了相同的label参数,例如,三个线都用了label='Mean'等,这会导致图例中重复的问题,因为每个axhline的label会被添加多次,但实际上可能只显示一次。或者,可能只显示最后一个。因此,可能需要重新处理这些标签。 例如,原来的代码: plt.axhline(y=overall_mean, color='r', linestyle='-', linewidth=1, label='Mean') plt.axhline(y=upper_bound, color='r', linestyle='-', linewidth=1, label='mean+3σ') plt.axhline(y=lower_bound, color='r', linestyle='-', linewidth=1, label='mean-3σ') 这三次调用axhline,每次的label不同。如果之后调用plt.legend(),这三个标签会出现在图例中,作为三条红色实线。但同时,散点的颜色图例也需要添加。所以,可能需要将这两部分合并。 此时,可能需要收集所有需要的图例句柄,包括红色线条和wafer_type的颜色标记。 可能的步骤: 1. 绘制箱线图,设置颜色。 2. 绘制散点,每个点的颜色对应wafer_type。 3. 绘制三条红色水平线,分别用不同的label。 4. 创建两个图例:一个用于wafer_type的颜色,另一个用于均值线。但matplotlib通常只支持一个图例,除非手动添加第二个。 或者,将所有图例条目合并到一个图例中。 例如,创建自定义的图例句柄,包括红色线条和颜色点。 但是这可能比较复杂。另一种方法是,在绘制散点时,不设置label,而是手动创建图例条目,同时包括wafer_type和均值线的条目。 例如: # 创建自定义图例句柄 legend_elements = [ # wafer_type的条目 Line2D([0], [0], marker='o', color='w', label='DRB_WAFER', markerfacecolor=COLOR_MAP['DRB_WAFER'], markersize=8), Line2D([0], [0], marker='o', color='w', label='NONE_DRB_WAFER', markerfacecolor=COLOR_MAP['NONE_DRB_WAFER'], markersize=8), Line2D([0], [0], marker='o', color='w', label='Other', markerfacecolor=COLOR_MAP['default'], markersize=8), # 均值线的条目 Line2D([0], [0], color='r', linestyle='-', linewidth=1, label='Mean'), Line2D([0], [0], color='r', linestyle='-', linewidth=1, label='Mean ±3σ') ] 然后,使用plt.legend(handles=legend_elements)来显示所有条目。但这样可能需要调整,因为原来的三个水平线有三个不同的标签,而这里可能将它们合并为两个条目,比如Mean和上下限。 这可能不符合用户的原意。用户原来的三个axhline分别标为Mean、mean+3σ、mean-3σ,因此需要这三个标签都出现在图例中。 因此,可能需要分别为这三个线创建图例句柄: legend_elements = [ # wafer_type的条目 Line2D([0], [0], marker='o', color='w', label='DRB_WAFER', markerfacecolor=COLOR_MAP['DRB_WAFER'], markersize=8), Line2D([0], [0], marker='o', color='w', label='NONE_DRB_WAFER', markerfacecolor=COLOR_MAP['NONE_DRB_WAFER'], markersize=8), Line2D([0], [0], marker='o', color='w', label='Other', markerfacecolor=COLOR_MAP['default'], markersize=8), # 均值线 Line2D([0], [0], color='r', linestyle='-', linewidth=1, label='Mean'), Line2D([0], [0], color='r', linestyle='-', linewidth=1, label='Mean +3σ'), Line2D([0], [0], color='r', linestyle='-', linewidth=1, label='Mean -3σ') ] 然后,将这些handles传递给plt.legend(handles=legend_elements)。这样,图例中将包含所有需要的条目。 不过,这样的图例可能比较冗长,但符合用户的需求。 现在,需要将这些整合到用户的代码中。 总结需要修改的步骤: 1. 在绘制箱线图之后,遍历每个分组,绘制散点。 2. 为每个散点设置对应的颜色,根据wafer_type。 3. 添加抖动,避免点重叠。 4. 创建自定义图例,包含wafer_type的颜色和均值线的标签。 5. 调用plt.legend()显示所有图例。 现在,检查用户的代码中是否已经调用了plt.legend()。是的,用户原来的代码在绘制三条水平线时,使用了label参数,但可能没有调用plt.legend()来显示图例。或者可能调用了,但此时只会显示三条线的图例,而散点的颜色图例不会被显示。 查看用户提供的代码,发现在绘制三条线后,并没有调用plt.legend()。所以,用户当前的代码可能没有显示任何图例。因此,需要添加plt.legend()来显示。 因此,现在需要: - 在绘制散点后,创建图例,包含wafer_type和三条线的标签。 可能的代码修改步骤: 在用户代码的末尾,添加: # 创建图例 handles, labels = plt.gca().get_legend_handles_labels() by_label = dict(zip(labels, handles)) # 去重 plt.legend(by_label.values(), by_label.keys(), loc='best') 但这可能无法正确捕获所有条目,因为散点没有设置label,而axhline设置了label。因此,可能需要手动创建图例句柄。 或者,更好的方法是手动创建所有需要的图例句柄,如之前所述。 因此,正确的做法是: 在绘制散点后,手动创建图例的条目,包括: - 三个wafer_type的颜色标记(散点)。 - 三条红色水平线的标签。 因此,修改后的代码部分: # 创建绘图 plt.figure(figsize=(20, 10)) boxplot = plt.boxplot( data, tick_labels=labels, patch_artist=True ) # 设置颜色 COLOR_MAP = { 'DRB_WAFER': '#66CDAA', 'NONE_DRB_WAFER': '#FFDEAD', 'default': '#B0C4DE' } for i, (name, group) in enumerate(grouped_by_label): wafer_type = group['WAFER_TYPE'].iloc[0] color = COLOR_MAP.get(wafer_type, COLOR_MAP['default']) boxplot['boxes'][i].set_facecolor(color) # 绘制所有数据点,按wafer_type颜色 for i, (name, group) in enumerate(grouped_by_label): wafer_type = group['WAFER_TYPE'].iloc[0] color = COLOR_MAP.get(wafer_type, COLOR_MAP['default']) x_pos = i + 1 # 箱线图的x位置从1开始 y_values = group['VALUE'].values # 添加随机抖动避免点重叠 jitter = np.random.normal(0, 0.05, size=len(y_values)) # 调整抖动量 plt.scatter(x_pos + jitter, y_values, color=color, alpha=0.5, s=20, edgecolors='k', linewidths=0.5) # 绘制均值线和上下限 mean_line = plt.axhline(y=overall_mean, color='r', linestyle='-', linewidth=1, label='Mean') upper_line = plt.axhline(y=upper_bound, color='r', linestyle='--', linewidth=1, label='Mean +3σ') lower_line = plt.axhline(y=lower_bound, color='r', linestyle=':', linewidth=1, label='Mean -3σ') # 创建图例 # 创建wafer_type的图例句柄 wafer_legend = [ plt.Line2D([0], [0], marker='o', color='w', label='DRB_WAFER', markerfacecolor=COLOR_MAP['DRB_WAFER'], markersize=8), plt.Line2D([0], [0], marker='o', color='w', label='NONE_DRB_WAFER', markerfacecolor=COLOR_MAP['NONE_DRB_WAFER'], markersize=8), plt.Line2D([0], [0], marker='o', color='w', label='Other', markerfacecolor=COLOR_MAP['default'], markersize=8) ] # 获取均值线的图例句柄 lines_legend = [mean_line, upper_line, lower_line] # 合并图例句柄和标签 all_handles = wafer_legend + lines_legend plt.legend(handles=all_handles, loc='best') 这样,图例将包含wafer_type的颜色标记和三条均值线的不同样式。但需要注意的是,三条均值线使用了不同的线型(实线、虚线、点线),以便在图例中区分。例如,将upper_line的linestyle改为'--',lower_line改为':',这样图例中的线条样式不同,可以区分不同的上下限。 但用户原来的代码中,三条线都是实线(linestyle='-'),这可能让图例中的三个线条看起来一样,导致混淆。因此,可能需要调整线型,或者在标签中明确说明。 或者,保持线型一致,但用标签区分,例如: mean_line = plt.axhline(..., label='Mean') upper_line = plt.axhline(..., label='Upper Bound (Mean +3σ)') lower_line = plt.axhline(..., label='Lower Bound (Mean -3σ)') 这样,即使线型相同,图例中的标签也能说明区别。但这样三个红色线可能在图例中显示为三个相同的红色实线,难以区分。因此,可能需要调整线型,使它们在图例中有不同的样式。 因此,在绘制三条线时,为它们设置不同的线型: plt.axhline(y=overall_mean, color='r', linestyle='-', linewidth=1, label='Mean') plt.axhline(y=upper_bound, color='r', linestyle='--', linewidth=1, label='Mean +3σ') plt.axhline(y=lower_bound, color='r', linestyle=':', linewidth=1, label='Mean -3σ') 这样,图例中的三条线将分别以实线、虚线和点线显示,便于区分。 综上,用户需要修改的代码部分包括: 1. 在绘制箱线图后,遍历每个分组,绘制散点图,添加颜色和抖动。 2. 为三条水平线设置不同的线型和标签。 3. 手动创建图例句柄,合并wafer_type的颜色标记和三条线的样式。 这样,用户就能在图上看到所有数据点,并根据wafer_type着色,同时图例中显示对应的颜色和均值线的说明。 现在,需要检查代码是否还有其他需要注意的地方。例如,抖动的大小、散点的透明度、边缘颜色等,以确保散点图清晰可见,不与箱线图混淆。 此外,可能需要注意数据点的顺序,确保每个散点的x位置与对应的箱线图一致。 最后,确保所有必要的库已导入,例如numpy和matplotlib.pyplot,以及pandas。 用户提供的代码中已经使用了numpy和matplotlib.pyplot,所以需要确认这些导入存在,但可能用户在实际代码中已经处理好了。 综上,最终的代码修改部分应该包括上述步骤,确保数据点被正确绘制,颜色正确,图例完整。</think>以下是代码功能的逐步解释及可视化改进方案: 一、代码功能解析 1. 数据分组处理 - 外层循环:按DRB_ID和批次号分组,区分不同生产批次 - 内层循环:遍历每个检测参数,实现参数级分析 2. 统计量计算 $$ \mu = \frac{1}{n}\sum_{i=1}^{n}x_i $$ $$ 3\sigma 范围 = \mu \pm 3\sigma $$ 通过Pandas计算全局均值和标准差,建立工艺管控基线 3. 数据标注 - 使用条件判断生成晶圆编号标签 - 按测量时间排序保证时序性 - 分类存储数据为绘图做准备 二、可视化增强方案 1. 数据点标注实现 ```python # 在箱线图上叠加散点(需添加在plt.boxplot之后) for i, (name, group) in enumerate(grouped_by_label): # 获取对应分组的坐标和颜色 x_position = i + 1 # 箱线图x轴从1开始计数 y_values = group['VALUE'].values wafer_type = group['WAFER_TYPE'].iloc[0] color = COLOR_MAP.get(wafer_type, COLOR_MAP['default']) # 添加随机水平抖动 jitter = np.random.normal(0, 0.05, size=len(y_values)) plt.scatter( x_position + jitter, y_values, color=color, alpha=0.6, # 设置透明度 edgecolor='k', # 数据点描边 linewidth=0.3, # 边线粗细 s=15, # 点大小 zorder=3 # 确保点在箱线图上方 ) ``` 2. 图例系统优化 ```python # 创建自定义图例组件(需在plt.legend之前) from matplotlib.lines import Line2D # 晶圆类型图例 wafer_legend = [ Line2D([0], [0], marker='o', color='w', label='DRB_WAFER', markerfacecolor=COLOR_MAP['DRB_WAFER'], markersize=8), Line2D([0], [0], marker='o', color='w', label='NONE_DRB_WAFER', markerfacecolor=COLOR_MAP['NONE_DRB_WAFER'], markersize=8) ] # 统计线图例 stat_legend = [ Line2D([0], [0], color='r', linestyle='-', label='均值线'), Line2D([0], [0], color='r', linestyle='--', label='均值+3σ'), Line2D([0], [0], color='r', linestyle=':', label='均值-3σ') ] # 合并图例并设置 plt.legend(handles=wafer_legend + stat_legend, loc='upper right', framealpha=0.9, ncol=2) # 分两列显示 ``` 三、完整改进代码结构 ```python for DRB_ID, lot_group in grouped: for param in lot_group['PARAMETER_MAPPING'].unique(): # ...原有数据处理部分保持不变... # 创建绘图 plt.figure(figsize=(20, 10)) boxplot = plt.boxplot(data, tick_labels=labels, patch_artist=True) # 箱线填色 for i, (name, group) in enumerate(grouped_by_label): # ...原有填色代码... # 叠加数据点 for i, (name, group) in enumerate(grouped_by_label): # 上述散点绘制代码... # 添加统计线(修改线型) plt.axhline(overall_mean, color='r', linestyle='-', linewidth=1) plt.axhline(upper_bound, color='r', linestyle='--', linewidth=1) plt.axhline(lower_bound, color='r', linestyle=':', linewidth=1) # 添加图例 # 上述图例创建代码... # 其余图表设置保持不变... plt.show() ``` 四、可视化效果增强说明 1. 数据分布呈现 - 箱线图:展示数据分布的统计特征(中位数、四分位数等) - 散点图:揭示原始数据密度和离群点 - 统计线:标定工艺控制边界 2. 视觉优化设计 - 颜色映射:使用差异明显的色系区分晶圆类型 - 点阵参数:通过透明度(alpha)和描边增强重叠数据辨识度 - 布局优化:分栏图例节省空间,确保信息完整可见 该方案在保持原有分析逻辑的基础上,通过数据点可视化增强过程监控能力,图例系统使图表解读更加直观,适用于半导体制造等需要高精度过程控制的场景。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值