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; using System.Web.UI.DataVisualization.Charting.Utilities; /// ///DrawChart 的摘要说明 /// public partial class DrawChart { /// /// 排列图 /// /// /// public static void ChartQualityData_Pareto(double[] X,Chart chart1) { int n=8; chart1.Series["RawData"].Points.DataBindY(X); 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); } /// /// 直方图 /// /// /// public static void ChartQualityData_Histogram(double[] X, Chart chart1) { int n = 8; chart1.Series["RawData"].Points.DataBindY(X); // Populate single axis data distribution series. Show Y value of the // data series as X value and set all Y values to 1. foreach (DataPoint dataPoint in chart1.Series["RawData"].Points) { chart1.Series["DataDistribution"].Points.AddXY(dataPoint.YValues[0], 1); } // Create a histogram series HistogramChartHelper histogramHelper = new HistogramChartHelper(); histogramHelper.SegmentIntervalNumber = n; histogramHelper.ShowPercentOnSecondaryYAxis = false; // NOTE: Interval width may be specified instead of interval number //histogramHelper.SegmentIntervalWidth = 15; histogramHelper.CreateHistogram(chart1, "RawData", "Histogram"); } /// /// 分析正态分布图 /// /// 被分析数据组 /// 理论上限 /// 理论下限 /// public static void ChartQualityData_NormalDistribution(double[] X, double Usl, double Lsl, Chart chart1) { double x; double s; double QU; double QL; double cp; double cpk; double[] sx; double[] sy; double ValueUp = Max(X); double ValueDown = Min(X); //计算SPC参数 SpcCaculator.SpcValue(X, ref Usl, ref Lsl, out x, out s, out QU, out QL, out cp, out cpk, out sx, out sy); //坐标轴 double ValueUpX = Convert.ToDouble(Max(sx).ToString("F4")); double ValueDownX = Convert.ToDouble(Min(sx).ToString("F4")); double ValueUpY = Convert.ToDouble(Max(sy).ToString("F4")); ValueDownX = Math.Min(ValueDownX, Lsl); ValueDownX = Math.Min(ValueDownX, QL); ValueUpX = Math.Max(ValueUpX, Usl); ValueUpX = Math.Max(ValueUpX, QU); double X1 = (ValueUpX - ValueDownX) / 10; chart1.ChartAreas["ChartArea1"].AxisX.Minimum = Math.Round(ValueDownX - X1, 4); chart1.ChartAreas["ChartArea1"].AxisX.Maximum = Math.Round(ValueUpX + X1, 4); chart1.ChartAreas["ChartArea1"].AxisY.Minimum = 0; chart1.ChartAreas["ChartArea1"].AxisY.Maximum = Math.Round(ValueUpY + ValueUpY / 10, 4); //绘图正态分布曲线(共取了11个点) for (int i = 0; i < sx.Length; i++) { chart1.Series[0].Points.AddXY(Math.Round(sx[i], 4), Math.Round(sy[i], 4)); } chart1.ChartAreas["ChartArea1"].AxisX.StripLines[1].IntervalOffset = sx[5]; chart1.ChartAreas["ChartArea1"].AxisX.StripLines[1].Text = "SL=" + sx[5].ToString("F4"); chart1.ChartAreas["ChartArea1"].AxisX.StripLines[2].IntervalOffset = Usl; chart1.ChartAreas["ChartArea1"].AxisX.StripLines[2].Text = "USL=" + Usl.ToString("F4"); chart1.ChartAreas["ChartArea1"].AxisX.StripLines[3].IntervalOffset = Lsl; chart1.ChartAreas["ChartArea1"].AxisX.StripLines[3].Text = "LSL=" + Lsl.ToString("F4"); chart1.ChartAreas["ChartArea1"].AxisX.StripLines[4].IntervalOffset = QL; chart1.ChartAreas["ChartArea1"].AxisX.StripLines[4].Text = "QL=" + QL.ToString("F4"); chart1.ChartAreas["ChartArea1"].AxisX.StripLines[5].IntervalOffset = QU; chart1.ChartAreas["ChartArea1"].AxisX.StripLines[5].Text = "QU=" + QU.ToString("F4"); //将CpCpk绘制到图形中 DarwCpCpk(chart1, cp, cpk); //TextAnnotation annotation3; //annotation3 = new TextAnnotation(); //annotation3.Text = "Cp=" + cp.ToString("F2"); //annotation3.ForeColor = Color.Black; //annotation3.Font = new Font("Arial", 11); ; //annotation3.X = 60; //annotation3.Y = 90; //chart1.Annotations.Add(annotation3); //annotation3 = new TextAnnotation(); //annotation3.Text = "Cpk=" + cpk.ToString("F2"); //annotation3.ForeColor = Color.Black; //annotation3.Font = new Font("Arial", 11); ; //annotation3.X = 80; //annotation3.Y = 90; //chart1.Annotations.Add(annotation3); } /// /// SPC分析基本趋势图 /// /// /// public static void ChartQualityData_TrendPictureBasic_new(DataTable dt, double Usl, double Lsl, Chart chart1) { double x; double s; double QU; double QL; double cp; double cpk; double[] sx; double[] sy; double[] X; if (dt.Rows.Count < 3) return; X = new double[dt.Rows.Count]; for (int i = 0; i < dt.Rows.Count; i++) { X[i] = Convert.ToDouble(dt.Rows[i][0]); } double ValueUp = Max(X); double ValueDown = Min(X); //计算SPC参数 SpcCaculator.SpcValue(X, ref Usl, ref Lsl, out x, out s, out QU, out QL, out cp, out cpk, out sx, out sy); //坐标轴 double ValueUpX; double ValueDownX; ValueDownX = Math.Min(ValueDown, Lsl); ValueDownX = Math.Min(ValueDownX, QL); ValueUpX = Math.Max(ValueUp, Usl); ValueUpX = Math.Max(ValueUpX, QU); double X1 = (ValueUpX - ValueDownX) / 10; chart1.ChartAreas["ChartArea1"].AxisY.Minimum = Math.Round(ValueDownX - X1, 4); chart1.ChartAreas["ChartArea1"].AxisY.Maximum = Math.Round(ValueUpX + X1, 4); chart1.ChartAreas["ChartArea1"].AxisY.StripLines[1].IntervalOffset = sx[5]; chart1.ChartAreas["ChartArea1"].AxisY.StripLines[1].Text = "SL=" + sx[5].ToString("F4"); chart1.ChartAreas["ChartArea1"].AxisY.StripLines[2].IntervalOffset = Usl; chart1.ChartAreas["ChartArea1"].AxisY.StripLines[2].Text = "USL=" + Usl.ToString("F4"); chart1.ChartAreas["ChartArea1"].AxisY.StripLines[3].IntervalOffset = Lsl; chart1.ChartAreas["ChartArea1"].AxisY.StripLines[3].Text = "LSL=" + Lsl.ToString("F4"); chart1.ChartAreas["ChartArea1"].AxisY.StripLines[4].IntervalOffset = QU; chart1.ChartAreas["ChartArea1"].AxisY.StripLines[4].Text = "QU=" + QU.ToString("F4"); chart1.ChartAreas["ChartArea1"].AxisY.StripLines[5].IntervalOffset = QL; chart1.ChartAreas["ChartArea1"].AxisY.StripLines[5].Text = "QL=" + QL.ToString("F4"); chart1.Series[0].Points.DataBind(dt.DefaultView, "", "测量值", "Tooltip=ToolTip"); //将CpCpk绘制到图形中 DarwCpCpk(chart1, cp, cpk); } /// /// 将CpCpk绘制到图形中 /// /// /// /// static private void DarwCpCpk(Chart chart1,double cp,double cpk) { TextAnnotation annotation; annotation = (TextAnnotation)chart1.Annotations["TextAnnotationCp"]; annotation.Text = "Cp=" + cp.ToString("F2"); annotation = (TextAnnotation)chart1.Annotations["TextAnnotationCpk"]; annotation.Text = "Cpk=" + cpk.ToString("F2"); } }