using System; using System.Drawing; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data; using System.Web.UI.DataVisualization.Charting; using System.Data.SqlClient; /// ///DrawChart 的摘要说明 /// public partial class DrawChart { public static void ChartQualityData_Pareto(DataTable dt,int n, Chart chart1) { chart1.Series["RawData"].Points.DataBindY(dt.Rows, "测量值"); DrawPareto drawPareto = new DrawPareto(); drawPareto.SegmentIntervalNumber = n; drawPareto.ShowPercentOnSecondaryYAxis = false; drawPareto.CreatePareto(chart1, "RawData", "Histogram"); drawPareto.MakeParetoChart(chart1, "Histogram", "Pareto"); // Set chart types for output data chart1.Series["Pareto"].ChartType = SeriesChartType.Line; // set the markers for each point of the Pareto Line chart1.Series["Pareto"].IsValueShownAsLabel = true; chart1.Series["Pareto"].MarkerColor = Color.Red; chart1.Series["Pareto"].MarkerBorderColor = Color.MidnightBlue; chart1.Series["Pareto"].MarkerStyle = MarkerStyle.Circle; chart1.Series["Pareto"].MarkerSize = 6; chart1.Series["Pareto"].LabelFormat = "0.#"; // format with one decimal and leading zero // Set Color of line Pareto chart chart1.Series["Pareto"].Color = Color.FromArgb(252, 180, 65); } /// /// SPC分析正态分布图 /// /// /// /// public static void ChartQualityData_NormalDistribution(double[] X, int n, Chart chart1) { double ValueUp = Max(X); double ValueDown = Min(X); //绘图数据 ASPNet_Drawing.CSpc_Data_Cpk Spc_Data_Cpk = ASPNet_Drawing.Spc_Data.Cpk(X, n, ValueUp, ValueDown); //坐标轴 double ValueUpX = Convert.ToDouble(Max(Spc_Data_Cpk.NormalDistributionX).ToString("F2")); double ValueDownX = Convert.ToDouble(Min(Spc_Data_Cpk.NormalDistributionX).ToString("F2")); double ValueUpY = Convert.ToDouble(Max(Spc_Data_Cpk.NormalDistributionY).ToString("F2")); double X1 = (ValueUpX - ValueDownX) / 10; chart1.ChartAreas["ChartArea1"].AxisX.Minimum = Math.Round(ValueDownX - X1, 2); chart1.ChartAreas["ChartArea1"].AxisX.Maximum = Math.Round(ValueUpX + X1, 2); chart1.ChartAreas["ChartArea1"].AxisY.Minimum = 0; chart1.ChartAreas["ChartArea1"].AxisY.Maximum = Math.Round(ValueUpY + ValueUpY / 10, 2); //绘图 for (int i = 0; i < Spc_Data_Cpk.NormalDistributionX.Length; i++) { chart1.Series[0].Points.AddXY(Math.Round(Spc_Data_Cpk.NormalDistributionX[i], 2), Math.Round(Spc_Data_Cpk.NormalDistributionY[i], 2)); } // Set Strip line item //chart1.ChartAreas["ChartArea1"].AxisX.StripLines[0].IntervalOffset = Spc_Data_Cpk.LSL; //chart1.ChartAreas["ChartArea1"].AxisX.StripLines[0].StripWidth = Spc_Data_Cpk.USL - Spc_Data_Cpk.LSL; // Set Strip line item //double SL = (ValueUpX + ValueDownX) / 2; //double USL = SL + 3 * Spc_Data_Cpk.Singma; //double LSL = SL - 3 * Spc_Data_Cpk.Singma; chart1.ChartAreas["ChartArea1"].AxisX.StripLines[1].IntervalOffset = Spc_Data_Cpk.NormalDistributionX[4]; chart1.ChartAreas["ChartArea1"].AxisX.StripLines[1].Text = "SL=" + Spc_Data_Cpk.NormalDistributionX[4].ToString("F2"); chart1.ChartAreas["ChartArea1"].AxisX.StripLines[2].IntervalOffset = Spc_Data_Cpk.NormalDistributionX[1]; chart1.ChartAreas["ChartArea1"].AxisX.StripLines[2].Text = "USL=" + Spc_Data_Cpk.NormalDistributionX[1].ToString("F2"); chart1.ChartAreas["ChartArea1"].AxisX.StripLines[3].IntervalOffset = Spc_Data_Cpk.NormalDistributionX[7]; chart1.ChartAreas["ChartArea1"].AxisX.StripLines[3].Text = "LSL=" + Spc_Data_Cpk.NormalDistributionX[7].ToString("F2"); //TextAnnotation annotation1 = new TextAnnotation(); //annotation1.Text = "Cpk=" + Spc_Data_Cpk.Cpk.ToString("F2"); //annotation1.ForeColor = Color.Black; //annotation1.Font = new Font("Arial", 11); ; //annotation1.X = 80; //annotation1.Y = 8; //chart1.Annotations.Add(annotation1); //TextAnnotation annotation2 = new TextAnnotation(); //annotation2.Text = "CPL=" + Spc_Data_Cpk.CPL.ToString("F2"); //annotation2.ForeColor = Color.Black; //annotation2.Font = new Font("Arial", 11); ; //annotation2.X = 80; //annotation2.Y = 13; //chart1.Annotations.Add(annotation2); //TextAnnotation annotation3 = new TextAnnotation(); //annotation3.Text = "CPU=" + Spc_Data_Cpk.CPU.ToString("F2"); //annotation3.ForeColor = Color.Black; //annotation3.Font = new Font("Arial", 11); ; //annotation3.X = 80; //annotation3.Y = 18; //chart1.Annotations.Add(annotation3); } /// /// SPC分析工序能力图 /// 在均值级差图中 /// /// /// /// public static void ChartQualityData_Cpk_XR(double[] X, int n, Chart chart1) { double ValueUp = Max(X); double ValueDown = Min(X); //绘图数据 ASPNet_Drawing.CSpc_Data_Cpk Spc_Data_Cpk = ASPNet_Drawing.Spc_Data.Cpk(X, n, ValueUp, ValueDown); //坐标轴 double ValueUpX = Convert.ToDouble(Max(Spc_Data_Cpk.NormalDistributionX).ToString("F2")); double ValueDownX = Convert.ToDouble(Min(Spc_Data_Cpk.NormalDistributionX).ToString("F2")); double ValueUpY = Convert.ToDouble(Max(Spc_Data_Cpk.NormalDistributionY).ToString("F2")); double X1 = (ValueUpX - ValueDownX) / 10; chart1.ChartAreas["ChartArea_Cpk"].AxisX.Minimum = Math.Round(ValueDownX - X1, 2); chart1.ChartAreas["ChartArea_Cpk"].AxisX.Maximum = Math.Round(ValueUpX + X1, 2); chart1.ChartAreas["ChartArea_Cpk"].AxisY.Minimum = 0; chart1.ChartAreas["ChartArea_Cpk"].AxisY.Maximum = Math.Round(ValueUpY + ValueUpY / 10, 2); //绘图 for (int i = 0; i < Spc_Data_Cpk.NormalDistributionX.Length; i++) { chart1.Series["Series_Cpk"].Points.AddXY(Math.Round(Spc_Data_Cpk.NormalDistributionX[i], 2), Math.Round(Spc_Data_Cpk.NormalDistributionY[i], 2)); } ASPNet_Drawing.CSpc_Data_XR Spc_Data_XR = ASPNet_Drawing.Spc_Data.XR(X, n); chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[1].IntervalOffset = Spc_Data_Cpk.NormalDistributionX[4]; chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[1].Text = "SL=" + Spc_Data_XR.CL_X.ToString("F2"); chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[2].IntervalOffset = Spc_Data_Cpk.NormalDistributionX[1]; chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[2].Text = "USL=" + Spc_Data_XR.UCL_X.ToString("F2"); chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[3].IntervalOffset = Spc_Data_Cpk.NormalDistributionX[7]; chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[3].Text = "LSL=" + Spc_Data_XR.LCL_X.ToString("F2"); TextAnnotation annotation1 = new TextAnnotation(); annotation1.Text = "Cpk=" + Spc_Data_Cpk.Cpk.ToString("F2"); annotation1.ForeColor = Color.Black; annotation1.Font = new Font("Arial", 6); ; annotation1.X = 27; annotation1.Y = 3.5; chart1.Annotations.Add(annotation1); TextAnnotation annotation2 = new TextAnnotation(); annotation2.Text = "CPL=" + Spc_Data_Cpk.CPL.ToString("F2"); annotation2.ForeColor = Color.Black; annotation2.Font = new Font("Arial", 6); ; annotation2.X = 27; annotation2.Y = 5; chart1.Annotations.Add(annotation2); TextAnnotation annotation3 = new TextAnnotation(); annotation3.Text = "CPU=" + Spc_Data_Cpk.CPU.ToString("F2"); annotation3.ForeColor = Color.Black; annotation3.Font = new Font("Arial", 6); ; annotation3.X = 27; annotation3.Y = 6.5; chart1.Annotations.Add(annotation3); } /// /// SPC分析工序能力图 /// 在均值标准差图中 /// /// /// /// public static void ChartQualityData_Cpk_XS(double[] X, int n, Chart chart1) { double ValueUp = Max(X); double ValueDown = Min(X); //绘图数据 ASPNet_Drawing.CSpc_Data_Cpk Spc_Data_Cpk = ASPNet_Drawing.Spc_Data.Cpk(X, n, ValueUp, ValueDown); //坐标轴 double ValueUpX = Convert.ToDouble(Max(Spc_Data_Cpk.NormalDistributionX).ToString("F2")); double ValueDownX = Convert.ToDouble(Min(Spc_Data_Cpk.NormalDistributionX).ToString("F2")); double ValueUpY = Convert.ToDouble(Max(Spc_Data_Cpk.NormalDistributionY).ToString("F2")); double X1 = (ValueUpX - ValueDownX) / 10; chart1.ChartAreas["ChartArea_Cpk"].AxisX.Minimum = Math.Round(ValueDownX - X1, 2); chart1.ChartAreas["ChartArea_Cpk"].AxisX.Maximum = Math.Round(ValueUpX + X1, 2); chart1.ChartAreas["ChartArea_Cpk"].AxisY.Minimum = 0; chart1.ChartAreas["ChartArea_Cpk"].AxisY.Maximum = Math.Round(ValueUpY + ValueUpY / 10, 2); //绘图 for (int i = 0; i < Spc_Data_Cpk.NormalDistributionX.Length; i++) { chart1.Series["Series_Cpk"].Points.AddXY(Math.Round(Spc_Data_Cpk.NormalDistributionX[i], 2), Math.Round(Spc_Data_Cpk.NormalDistributionY[i], 2)); } ASPNet_Drawing.CSpc_Data_XR Spc_Data_XR = ASPNet_Drawing.Spc_Data.XR(X, n); chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[1].IntervalOffset = Spc_Data_Cpk.NormalDistributionX[4]; chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[1].Text = "SL=" + Spc_Data_XR.CL_X.ToString("F2"); chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[2].IntervalOffset = Spc_Data_Cpk.NormalDistributionX[1]; chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[2].Text = "USL=" + Spc_Data_XR.UCL_X.ToString("F2"); chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[3].IntervalOffset = Spc_Data_Cpk.NormalDistributionX[7]; chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[3].Text = "LSL=" + Spc_Data_XR.LCL_X.ToString("F2"); TextAnnotation annotation1 = new TextAnnotation(); annotation1.Text = "Cpk=" + Spc_Data_Cpk.Cpk.ToString("F2"); annotation1.ForeColor = Color.Black; annotation1.Font = new Font("Arial", 6); ; annotation1.X = 27; annotation1.Y = 3.5; chart1.Annotations.Add(annotation1); TextAnnotation annotation2 = new TextAnnotation(); annotation2.Text = "CPL=" + Spc_Data_Cpk.CPL.ToString("F2"); annotation2.ForeColor = Color.Black; annotation2.Font = new Font("Arial", 6); ; annotation2.X = 27; annotation2.Y = 5; chart1.Annotations.Add(annotation2); TextAnnotation annotation3 = new TextAnnotation(); annotation3.Text = "CPU=" + Spc_Data_Cpk.CPU.ToString("F2"); annotation3.ForeColor = Color.Black; annotation3.Font = new Font("Arial", 6); ; annotation3.X = 27; annotation3.Y = 6.5; chart1.Annotations.Add(annotation3); } /// /// SPC分析工序能力图 /// /// /// /// public static void ChartQualityData_Cpk(double[] X, int n, Chart chart1) { double ValueUp = Max(X); double ValueDown = Min(X); //绘图数据 ASPNet_Drawing.CSpc_Data_Cpk Spc_Data_Cpk = ASPNet_Drawing.Spc_Data.Cpk(X, n, ValueUp, ValueDown); //坐标轴 double ValueUpX = Convert.ToDouble(Max(Spc_Data_Cpk.NormalDistributionX).ToString("F2")); double ValueDownX = Convert.ToDouble(Min(Spc_Data_Cpk.NormalDistributionX).ToString("F2")); double ValueUpY = Convert.ToDouble(Max(Spc_Data_Cpk.NormalDistributionY).ToString("F2")); double X1 = (ValueUpX - ValueDownX) / 10; chart1.ChartAreas["ChartArea_Cpk"].AxisX.Minimum = Math.Round(ValueDownX - X1, 2); chart1.ChartAreas["ChartArea_Cpk"].AxisX.Maximum = Math.Round(ValueUpX + X1, 2); chart1.ChartAreas["ChartArea_Cpk"].AxisY.Minimum = 0; chart1.ChartAreas["ChartArea_Cpk"].AxisY.Maximum = Math.Round(ValueUpY + ValueUpY / 10, 2); //绘图 for (int i = 0; i < Spc_Data_Cpk.NormalDistributionX.Length; i++) { chart1.Series["Series_Cpk"].Points.AddXY(Math.Round(Spc_Data_Cpk.NormalDistributionX[i], 2), Math.Round(Spc_Data_Cpk.NormalDistributionY[i], 2)); } // Set Strip line item //chart1.ChartAreas["ChartArea1"].AxisX.StripLines[0].IntervalOffset = Spc_Data_Cpk.LSL; //chart1.ChartAreas["ChartArea1"].AxisX.StripLines[0].StripWidth = Spc_Data_Cpk.USL - Spc_Data_Cpk.LSL; // Set Strip line item //double SL = (ValueUpX + ValueDownX) / 2; //double USL = SL + 3 * Spc_Data_Cpk.Singma; //double LSL = SL - 3 * Spc_Data_Cpk.Singma; chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[1].IntervalOffset = Spc_Data_Cpk.NormalDistributionX[4]; chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[1].Text = "SL=" + Spc_Data_Cpk.NormalDistributionX[4].ToString("F2"); chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[2].IntervalOffset = Spc_Data_Cpk.NormalDistributionX[1]; chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[2].Text = "USL=" + Spc_Data_Cpk.NormalDistributionX[1].ToString("F2"); chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[3].IntervalOffset = Spc_Data_Cpk.NormalDistributionX[7]; chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[3].Text = "LSL=" + Spc_Data_Cpk.NormalDistributionX[7].ToString("F2"); TextAnnotation annotation1 = new TextAnnotation(); annotation1.Text = "Cpk=" + Spc_Data_Cpk.Cpk.ToString("F2"); annotation1.ForeColor = Color.Black; annotation1.Font = new Font("Arial", 11); ; annotation1.X = 80; annotation1.Y = 8; chart1.Annotations.Add(annotation1); TextAnnotation annotation2 = new TextAnnotation(); annotation2.Text = "CPL=" + Spc_Data_Cpk.CPL.ToString("F2"); annotation2.ForeColor = Color.Black; annotation2.Font = new Font("Arial", 11); ; annotation2.X = 80; annotation2.Y = 13; chart1.Annotations.Add(annotation2); TextAnnotation annotation3 = new TextAnnotation(); annotation3.Text = "CPU=" + Spc_Data_Cpk.CPU.ToString("F2"); annotation3.ForeColor = Color.Black; annotation3.Font = new Font("Arial", 11); ; annotation3.X = 80; annotation3.Y = 18; chart1.Annotations.Add(annotation3); } /// /// 机床报警频次分析 /// /// /// public static void ChartMachineAlarm(DataTable dt, Chart chart1) { if (dt.Rows.Count == 0) return; string seriesName = dt.Rows[0]["工位号"].ToString(); chart1.Series.Add(seriesName); chart1.Series[seriesName].ChartType = SeriesChartType.Column; chart1.Series[seriesName].BorderWidth = 2; chart1.Series[seriesName].ToolTip = "报警文本:#VALX \n报警数量:#VALY"; chart1.Series[seriesName].Points.DataBindXY(dt.Rows, "报警文本", dt.Rows, "报警数量"); //for (int i = 0; i < 10; i++) //{ // chart1.Series[seriesName].Points.AddXY(dt.Rows[i]["报警编号"], dt.Rows[i]["报警数量"]); //} //chart1.DataBind(); } ///// ///// 机床状态频次分析 ///// ///// ///// //public static void ChartMachineStatus(DataTable dt, Chart chart1) //{ // foreach (DataRow row in dt.Rows) // { // // For each Row add a new series // string seriesName = row["工位号"].ToString(); // chart1.Series.Add(seriesName); // chart1.Series[seriesName].ChartType = SeriesChartType.StackedBar; // chart1.Series[seriesName].BorderWidth = 2; // chart1.Series[seriesName].ToolTip = "工位号:" + seriesName + "\n 频次:= #VALY"; // for (int colIndex = 2; colIndex < dt.Columns.Count; colIndex++) // { // // For each column (column 1 and onward) add the value as a point // string columnName = dt.Columns[colIndex].ColumnName; // int YVal = (int)row[columnName]; // chart1.Series[seriesName].Points.AddXY(columnName, YVal); // } // } //} ///// ///// 成海 2012-04-05 ///// ///// ///// public static void ChartMachineStatus(DataTable dt, Chart chart1) { string seriesNameA = "机床上电"; chart1.Series.Add(seriesNameA); chart1.Series[seriesNameA].ChartType = SeriesChartType.StackedColumn; chart1.Series[seriesNameA].BorderWidth = 2; chart1.Series[seriesNameA].ToolTip = "机床状态:" + seriesNameA + "\n 频次:= #VALY"; chart1.Series[seriesNameA].Color = System.Drawing.Color.DeepPink; string seriesNameB = "循环开始"; chart1.Series.Add(seriesNameB); chart1.Series[seriesNameB].ChartType = SeriesChartType.StackedColumn; chart1.Series[seriesNameB].BorderWidth = 2; chart1.Series[seriesNameB].ToolTip = "机床状态:" + seriesNameB + "\n 频次:= #VALY"; chart1.Series[seriesNameB].Color = System.Drawing.Color.Green; string seriesNameC = "机床故障"; chart1.Series.Add(seriesNameC); chart1.Series[seriesNameC].ChartType = SeriesChartType.StackedColumn; chart1.Series[seriesNameC].BorderWidth = 2; chart1.Series[seriesNameC].ToolTip = "机床状态:" + seriesNameC + "\n 频次:= #VALY"; chart1.Series[seriesNameC].Color = System.Drawing.Color.Red; string seriesNameD = "上料无件"; chart1.Series.Add(seriesNameD); chart1.Series[seriesNameD].ChartType = SeriesChartType.StackedColumn; chart1.Series[seriesNameD].BorderWidth = 2; chart1.Series[seriesNameD].ToolTip = "机床状态:" + seriesNameD + "\n 频次:= #VALY"; chart1.Series[seriesNameD].Color = System.Drawing.Color.Blue; string seriesNameE = "下料堵塞"; chart1.Series.Add(seriesNameE); chart1.Series[seriesNameE].ChartType = SeriesChartType.StackedColumn; chart1.Series[seriesNameE].BorderWidth = 2; chart1.Series[seriesNameE].ToolTip = "机床状态:" + seriesNameE + "\n 频次:= #VALY"; chart1.Series[seriesNameE].Color = System.Drawing.Color.Yellow; foreach (DataRow row in dt.Rows) { string opName = row["工位号"].ToString(); int YValA = (int)row["机床上电"]; chart1.Series[seriesNameA].Points.AddXY(opName, YValA); int YValB = (int)row["循环开始"]; chart1.Series[seriesNameB].Points.AddXY(opName, YValB); int YValC = (int)row["机床故障"]; chart1.Series[seriesNameC].Points.AddXY(opName, YValC); int YValD = (int)row["上料无件"]; chart1.Series[seriesNameD].Points.AddXY(opName, YValD); int YValE = (int)row["下料堵塞"]; chart1.Series[seriesNameE].Points.AddXY(opName, YValE); } } /// /// SPC分析基本趋势图 /// /// /// public static void ChartQualityData_TrendPictureBasic(DataTable dt, Chart chart1) { //string seriesName = "series1"; //chart1.Series.Add(seriesName); //chart1.Series[seriesName].MarkerStyle = MarkerStyle.Circle; //chart1.Series[seriesName].MarkerSize = 5; //chart1.Series[seriesName].MasrkerColor = Color.Magenta; //chart1.Series[seriesName].ChartType = SeriesChartType.Line; //chart1.Series[seriesName].BorderWidth = 1; chart1.Series[0].Points.DataBind(dt.DefaultView, "", "测量值", "Tooltip=ToolTip"); //chart1.DataBinds(); } /// /// 子组平均值的平均值 /// n 子组大小。单个子组观测值的个数 /// /// 全部测量数据数组 /// 子组大小。单个子组观测值的个数 /// 子组平均值的数组 /// static private double Average(double[] X, int n) { //k 子组个数 int k; k = X.Length / n; double[] Xi = new double[n]; double[] Xk = new double[k]; for (int j = 0; j < k; j++) { for (int i = 0; i < n; i++) { Xi[i] = X[j * n + i]; } //子组平均值 Xk[j] = Average(Xi); } //子组平均值的平均值 return Average(Xk); } /// /// 一组观测值的均值 /// /// 子组观测值 /// static private double Average(double[] Xn) { if (Xn.Length < 1) return 0; return Sum(Xn) / (double)Xn.Length; } /// /// 观测值和 /// /// 子组观测值 /// static private double Sum(double[] Xn) { double temp; temp = 0; for (int i = 0; i < Xn.Length; i++) { temp = temp + Xn[i]; } return temp; } /// /// 观测值最大值 /// /// 子组观测值 /// static private double Max(double[] Xn) { double temp; temp = Xn[0]; for (int i = 0; i < Xn.Length; i++) { temp = (Xn[i] > temp) ? Xn[i] : temp; } return temp; } /// /// 观测值最小值 /// /// 子组观测值 /// static private double Min(double[] Xn) { double temp; temp = Xn[0]; for (int i = 0; i < Xn.Length; i++) { temp = (Xn[i] < temp) ? Xn[i] : temp; } return temp; } /// /// 均值极差图 /// /// /// /// public static void ChartQualityData_XR(double[] X, int n, Chart chart1) { //计算XR控制图的数据 ASPNet_Drawing.CSpc_Data_XR Spc_Data_XR = ASPNet_Drawing.Spc_Data.XR(X, n); for (int i = 0; i < Spc_Data_XR.CL_Xk.Length; i++) { //X chart1.Series["Series_X"].Points.AddXY(i + 1, Spc_Data_XR.CL_Xk[i]); //R chart1.Series["Series_R"].Points.AddXY(i + 1, Spc_Data_XR.CL_Rk[i]); } chart1.Series["Series_X"].ToolTip = "测量值:= #VALY"; chart1.Series["Series_R"].ToolTip = "测量值:= #VALY"; ////均值图Y轴范围 double gapAxis_X = Spc_Data_XR.UCL_X - Spc_Data_XR.LCL_X; //均值的最大值 double maxXk = Max(Spc_Data_XR.CL_Xk); //均值的最小值 double minXk = Min(Spc_Data_XR.CL_Xk); if (maxXk > Spc_Data_XR.UCL_X) { chart1.ChartAreas["ChartArea_X"].AxisY.Maximum = Convert.ToDouble((maxXk + gapAxis_X / 8).ToString("F2")); } else { chart1.ChartAreas["ChartArea_X"].AxisY.Maximum = Convert.ToDouble((Spc_Data_XR.UCL_X + gapAxis_X / 8).ToString("F2")); } if (minXk < Spc_Data_XR.LCL_X) { chart1.ChartAreas["ChartArea_X"].AxisY.Minimum = Convert.ToDouble((minXk - gapAxis_X / 8).ToString("F2")); } else { chart1.ChartAreas["ChartArea_X"].AxisY.Minimum = Convert.ToDouble((Spc_Data_XR.LCL_X - gapAxis_X / 8).ToString("F2")); } ////极差图Y轴范围 double gapAxis_R = Spc_Data_XR.UCL_R - Spc_Data_XR.LCL_R; //极差最大值 double maxRk = Max(Spc_Data_XR.CL_Rk); //极差最小值 double minRk = Min(Spc_Data_XR.CL_Rk); if (maxRk > Spc_Data_XR.UCL_R) { chart1.ChartAreas["ChartArea_R"].AxisY.Maximum = Convert.ToDouble((maxRk + gapAxis_R / 8).ToString("F2")); } else { chart1.ChartAreas["ChartArea_R"].AxisY.Maximum = Convert.ToDouble((Spc_Data_XR.UCL_R + gapAxis_R / 8).ToString("F2")); } if (minRk < Spc_Data_XR.LCL_R) { chart1.ChartAreas["ChartArea_R"].AxisY.Minimum = Convert.ToDouble((minRk - gapAxis_R / 8).ToString("F2")); } else { chart1.ChartAreas["ChartArea_R"].AxisY.Minimum = Convert.ToDouble((Spc_Data_XR.LCL_R - gapAxis_R / 8).ToString("F2")); } // Set axis title chart1.ChartAreas["ChartArea_X"].AxisY.Title = "均值图"; chart1.ChartAreas["ChartArea_R"].AxisY.Title = "极差图"; chart1.ChartAreas["ChartArea_X"].AxisY.TitleFont = new Font("Microsoft Sans Serif", 8); chart1.ChartAreas["ChartArea_R"].AxisY.TitleFont = new Font("Microsoft Sans Serif", 8); // Set Strip line item chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[0].IntervalOffset = Spc_Data_XR.LCL_X; chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[0].StripWidth = Spc_Data_XR.UCL_X - Spc_Data_XR.LCL_X; // Set Strip line item chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[1].IntervalOffset = Spc_Data_XR.CL_X; chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[1].Text = "CL=" + Spc_Data_XR.CL_X.ToString("F2"); chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[2].IntervalOffset = Spc_Data_XR.UCL_X; chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[2].Text = "UCL=" + Spc_Data_XR.UCL_X.ToString("F2"); chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[3].IntervalOffset = Spc_Data_XR.LCL_X; chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[3].Text = "LCL=" + Spc_Data_XR.LCL_X.ToString("F2"); // Set Strip line item chart1.ChartAreas["ChartArea_R"].AxisY.StripLines[0].IntervalOffset = Spc_Data_XR.LCL_R; chart1.ChartAreas["ChartArea_R"].AxisY.StripLines[0].StripWidth = Spc_Data_XR.UCL_R - Spc_Data_XR.LCL_R; // Set Strip line item chart1.ChartAreas["ChartArea_R"].AxisY.StripLines[1].IntervalOffset = Spc_Data_XR.CL_R; chart1.ChartAreas["ChartArea_R"].AxisY.StripLines[1].Text = "CL=" + Spc_Data_XR.CL_R.ToString("F2"); chart1.ChartAreas["ChartArea_R"].AxisY.StripLines[2].IntervalOffset = Spc_Data_XR.UCL_R; chart1.ChartAreas["ChartArea_R"].AxisY.StripLines[2].Text = "UCL=" + Spc_Data_XR.UCL_R.ToString("F2"); chart1.ChartAreas["ChartArea_R"].AxisY.StripLines[3].IntervalOffset = Spc_Data_XR.LCL_R; chart1.ChartAreas["ChartArea_R"].AxisY.StripLines[3].Text = "LCL=" + Spc_Data_XR.LCL_R.ToString("F2"); } /// /// 均值标准差图 /// /// /// /// public static void ChartQualityData_XS(double[] X, int n, Chart chart1) { //计算XS控制图的数据 ASPNet_Drawing.CSpc_Data_XS Spc_Data_XS = ASPNet_Drawing.Spc_Data.XS(X, n); for (int i = 0; i < Spc_Data_XS.CL_Xk.Length; i++) { //X chart1.Series["Series_X"].Points.AddXY(i + 1, Spc_Data_XS.CL_Xk[i]); //S chart1.Series["Series_S"].Points.AddXY(i + 1, Spc_Data_XS.CL_Sk[i]); } chart1.Series["Series_X"].ToolTip = "测量值:= #VALY"; chart1.Series["Series_S"].ToolTip = "测量值:= #VALY"; ////均值图Y轴范围 double gapAxis_X = Spc_Data_XS.UCL_X - Spc_Data_XS.LCL_X; //均值的最大值 double maxXk = Max(Spc_Data_XS.CL_Xk); //均值的最小值 double minXk = Min(Spc_Data_XS.CL_Xk); if (maxXk > Spc_Data_XS.UCL_X) { chart1.ChartAreas["ChartArea_X"].AxisY.Maximum = Convert.ToDouble((maxXk + gapAxis_X / 8).ToString("F2")); } else { chart1.ChartAreas["ChartArea_X"].AxisY.Maximum = Convert.ToDouble((Spc_Data_XS.UCL_X + gapAxis_X / 8).ToString("F2")); } if (minXk < Spc_Data_XS.LCL_X) { chart1.ChartAreas["ChartArea_X"].AxisY.Minimum = Convert.ToDouble((minXk - gapAxis_X / 8).ToString("F2")); } else { chart1.ChartAreas["ChartArea_X"].AxisY.Minimum = Convert.ToDouble((Spc_Data_XS.LCL_X - gapAxis_X / 8).ToString("F2")); } ////标准差图Y轴范围 double gapAxis_R = Spc_Data_XS.UCL_S - Spc_Data_XS.LCL_S; //标准差最大值 double maxRk = Max(Spc_Data_XS.CL_Sk); //标准差最小值 double minRk = Min(Spc_Data_XS.CL_Sk); if (maxRk > Spc_Data_XS.UCL_S) { chart1.ChartAreas["ChartArea_S"].AxisY.Maximum = Convert.ToDouble((maxRk + gapAxis_R / 8).ToString("F2")); } else { chart1.ChartAreas["ChartArea_S"].AxisY.Maximum = Convert.ToDouble((Spc_Data_XS.UCL_S + gapAxis_R / 8).ToString("F2")); } if (minRk < Spc_Data_XS.LCL_S) { chart1.ChartAreas["ChartArea_S"].AxisY.Minimum = Convert.ToDouble((minRk - gapAxis_R / 8).ToString("F2")); } else { chart1.ChartAreas["ChartArea_S"].AxisY.Minimum = Convert.ToDouble((Spc_Data_XS.LCL_S - gapAxis_R / 8).ToString("F2")); } // Set axis title chart1.ChartAreas["ChartArea_X"].AxisY.Title = "均值图"; chart1.ChartAreas["ChartArea_S"].AxisY.Title = "标准差图"; chart1.ChartAreas["ChartArea_X"].AxisY.TitleFont = new Font("Microsoft Sans Serif", 8); chart1.ChartAreas["ChartArea_S"].AxisY.TitleFont = new Font("Microsoft Sans Serif", 8); // Set Strip line item chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[0].IntervalOffset = Spc_Data_XS.LCL_X; chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[0].StripWidth = Spc_Data_XS.UCL_X - Spc_Data_XS.LCL_X; // Set Strip line item chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[1].IntervalOffset = Spc_Data_XS.CL_X; chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[1].Text = "CL=" + Spc_Data_XS.CL_X.ToString("F2"); chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[2].IntervalOffset = Spc_Data_XS.UCL_X; chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[2].Text = "UCL=" + Spc_Data_XS.UCL_X.ToString("F2"); chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[3].IntervalOffset = Spc_Data_XS.LCL_X; chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[3].Text = "LCL=" + Spc_Data_XS.LCL_X.ToString("F2"); // Set Strip line item chart1.ChartAreas["ChartArea_S"].AxisY.StripLines[0].IntervalOffset = Spc_Data_XS.LCL_S; chart1.ChartAreas["ChartArea_S"].AxisY.StripLines[0].StripWidth = Spc_Data_XS.UCL_S - Spc_Data_XS.LCL_S; // Set Strip line item chart1.ChartAreas["ChartArea_S"].AxisY.StripLines[1].IntervalOffset = Spc_Data_XS.CL_S; chart1.ChartAreas["ChartArea_S"].AxisY.StripLines[1].Text = "CL=" + Spc_Data_XS.CL_S.ToString("F2"); chart1.ChartAreas["ChartArea_S"].AxisY.StripLines[2].IntervalOffset = Spc_Data_XS.UCL_S; chart1.ChartAreas["ChartArea_S"].AxisY.StripLines[2].Text = "UCL=" + Spc_Data_XS.UCL_S.ToString("F2"); chart1.ChartAreas["ChartArea_S"].AxisY.StripLines[3].IntervalOffset = Spc_Data_XS.LCL_S; chart1.ChartAreas["ChartArea_S"].AxisY.StripLines[3].Text = "LCL=" + Spc_Data_XS.LCL_S.ToString("F2"); } ///// ///// 故障率 lvzhen ///// ///// ///// //public static void ChartFaultPercent(DataTable dt, Chart chart1) //{ // if (dt.Rows.Count == 0) // return; // foreach (DataRow row in dt.Rows) // { // string seriesName = row["工位号"].ToString(); // chart1.Series.Add(seriesName); // chart1.Series[seriesName].ChartType = SeriesChartType.Column; // chart1.Series[seriesName].BorderWidth = 2; // chart1.Series[seriesName].ToolTip = "工位号:" + row["工位号"].ToString() + "\n运行时间: " + row["运行时间"].ToString() + "\n故障时间: " + row["故障时间"].ToString() + "\n故障率:#VALY"; // for (int colIndex = 3; colIndex < dt.Columns.Count; colIndex++) // { // // For each column (column 1 and onward) add the value as a point // string columnName = dt.Columns[colIndex].ColumnName; // string YVal = row[columnName].ToString(); // chart1.Series[seriesName].Points.AddXY(columnName, YVal); // } // //for (int i = 0; i < 10; i++) // //{ // // chart1.Series[seriesName].Points.AddXY(dt.Rows[i]["报警编号"], dt.Rows[i]["报警数量"]); // //} // //chart1.DataBind(); // } //} ///// ///// 故障率 lvzhen ///// ///// ///// //public static void ChartFaultPercentTrue(DataTable dt, Chart chart1) //{ // if (dt.Rows.Count == 0) // return; // foreach (DataRow row in dt.Rows) // { // string seriesName = row["工位号"].ToString(); // chart1.Series.Add(seriesName); // chart1.Series[seriesName].ChartType = SeriesChartType.Column; // chart1.Series[seriesName].BorderWidth = 2; // chart1.Series[seriesName].ToolTip = "工位号:" + row["工位号"].ToString() + " \n故障率:#VALY"; // for (int colIndex = 3; colIndex < dt.Columns.Count; colIndex++) // { // // For each column (column 1 and onward) add the value as a point // string columnName = dt.Columns[colIndex].ColumnName; // string YVal = row[columnName].ToString(); // chart1.Series[seriesName].Points.AddXY(columnName, YVal); // } // //for (int i = 0; i < 10; i++) // //{ // // chart1.Series[seriesName].Points.AddXY(dt.Rows[i]["报警编号"], dt.Rows[i]["报警数量"]); // //} // //chart1.DataBind(); // } //} ///// ///// 开机率 lvzhen ///// ///// ///// //public static void ChartKaijiProportion(DataTable dt, Chart chart1) //{ // chart1.Series[0].Points.DataBind(dt.DefaultView, "操作日期", "开机率", "Tooltip=ToolTip"); //} }