
一、先想清楚半导体测试场景里柱状图和折线图分别承担什么在 ATE/可靠性测试机上位机里这两类图的语义差别很大别混用柱状图离散类别对比。典型是各 HardBin/SoftBin 的芯片数量分布、各测试站点FT1/RT1的产出量、各 Sublot 的测试片数。折线图连续趋势。典型是良率随批次/时间变化、某测试项如 VDD_Isb_Stby的均值与标准差趋势、机台温度/电压的实时监控曲线。组合图柱折线双 Y 轴最常见的实战形态——柱子表示测试数量折线表示良率百分比一眼看出量涨了良率有没有掉。二、数据层设计建议先做再谈画图不要把 SQL 查询结果直接塞进图表控件中间加一层聚合模型publicclassYieldTrendPoint{publicstringLotId{get;set;}// 批次/时间标签publicintTotalDut{get;set;}// 测试总数 → 柱状图publicintPassDut{get;set;}// PASS 数publicdoubleYieldRateTotalDut0?0:PassDut*100.0/TotalDut;// 折线图publicdoubleCpk{get;set;}// 可选过程能力}如果数据源是 STDF可以直接用现成框架做解析和统计避免自己写二进制解析。例如 TDA 这类框架提供 STDF V4 解析、多 Sublot/复测数据关联、并行统计分析Cp/Cpk以及图表可视化能力可以按 Sublot 配置初测与复测轮次复测可指定仅针对某些 HardBin 的芯片再通过GetStatistics(testID)拿到 Mean、StdDev、Cp、Cpk。这类思路的好处是图表层只负责画统计口径统一在数据层。三、案例一WinForm Chart 控件最省事适合工控上位机// 1. 清空旧数据是基本礼仪chart1.Series.Clear();chart1.Titles.Add(批次良率与产出趋势);chart1.Legends[0].Enabledtrue;// 2. 柱状图测试数量varbarnewSeries(测试数量){ChartTypeSeriesChartType.Column};// 3. 折线图良率挂到右侧第二根 Y 轴varlinenewSeries(良率(%)){ChartTypeSeriesChartType.Line,BorderWidth2};line.YAxisTypeAxisType.Secondary;foreach(varpintrendList){bar.Points.AddXY(p.LotId,p.TotalDut);line.Points.AddXY(p.LotId,Math.Round(p.YieldRate,2));}chart1.Series.Add(bar);chart1.Series.Add(line);// 4. 右轴限定 0~100避免良率被数量量纲压平chart1.ChartAreas[0].AxisY2.Minimum0;chart1.ChartAreas[0].AxisY2.Maximum100;chart1.ChartAreas[0].AxisY2.LabelStyle.Format{0:F1}%;要点提示柱状图适合生产统计把Column改成StackedColumn就能变成堆积柱状图各 Bin 的构成一目了然温度类曲线用Spline会更平滑但要注意数据量破万时的性能问题。另外 Chart 控件在 .NET Core 下不再适用跨平台场景需要换库。四、案例二WPF LiveCharts适合看板/监控界面WPF 侧常见做法是 LiveCharts 配合 MVVM图表数据绑定 ViewModel 的集合属性实现自动刷新交互逻辑用 Interactivity 做命令绑定避免在视图里写后台代码。publicclassYieldTrendViewModel:BindableBase{privateSeriesCollection_seriesnew();publicSeriesCollectionSeries{get_series;setSetProperty(ref_series,value);}privatestring[]_labelsArray.Emptystring();publicstring[]Labels{get_labels;setSetProperty(ref_labels,value);}publicvoidLoad(IReadOnlyListYieldTrendPointdata){Labelsdata.Select(dd.LotId).ToArray();SeriesnewSeriesCollection{newColumnSeries{Title测试数量,ValuesnewChartValuesint(data.Select(dd.TotalDut))},newLineSeries{Title良率(%),ValuesnewChartValuesdouble(data.Select(dMath.Round(d.YieldRate,2))),PointGeometrySize5}};}}XAML 里只需一个CartesianChart容器标题行和图表行用 Grid 分行即可如果做深色大屏风格把容器背景设成深色、图表背景设为透明会更协调。五、几个容易踩的坑量纲不一致数量是千级、良率是百分数必须分双 Y 轴否则折线会贴底看不出波动。实时更新的线程问题定时器或后台线程刷新数据时务必通过 Dispatcher 切回 UI 线程再更新集合。复测数据要区分口径初测良率和复测后良率是两个指标混在一起算会让趋势失真建议在图上分开两条线或加筛选条件。别只看良率Bin 分布同样关键PASS 率不等于好品率还要看各 FAIL 类型的分布情况。大数据量折线点过多时考虑降采样或按时间窗口聚合如按小时/按批次汇总比硬塞几万个点更实用。如果你能说明是 WinForm 还是 WPF、数据来自数据库还是实时采集我可以给一份更贴合你项目结构的完整代码。