Exemplo n.º 1
0
    private void RecalculateAxesScale(ChartArea area) {
      // Reset the axes bounds so that RecalculateAxesScale() will assign new bounds
      foreach (Axis a in area.Axes) {
        a.Minimum = double.NaN;
        a.Maximum = double.NaN;
      }
      area.RecalculateAxesScale();
      area.AxisX.IsMarginVisible = false;
      area.AxisX2.IsMarginVisible = false;

      if (!Content.VisualProperties.XAxisMinimumAuto && !double.IsNaN(Content.VisualProperties.XAxisMinimumFixedValue)) area.AxisX.Minimum = Content.VisualProperties.XAxisMinimumFixedValue;
      if (!Content.VisualProperties.XAxisMaximumAuto && !double.IsNaN(Content.VisualProperties.XAxisMaximumFixedValue)) area.AxisX.Maximum = Content.VisualProperties.XAxisMaximumFixedValue;
      if (!Content.VisualProperties.SecondXAxisMinimumAuto && !double.IsNaN(Content.VisualProperties.SecondXAxisMinimumFixedValue)) area.AxisX2.Minimum = Content.VisualProperties.SecondXAxisMinimumFixedValue;
      if (!Content.VisualProperties.SecondXAxisMaximumAuto && !double.IsNaN(Content.VisualProperties.SecondXAxisMaximumFixedValue)) area.AxisX2.Maximum = Content.VisualProperties.SecondXAxisMaximumFixedValue;
      if (!Content.VisualProperties.YAxisMinimumAuto && !double.IsNaN(Content.VisualProperties.YAxisMinimumFixedValue)) area.AxisY.Minimum = Content.VisualProperties.YAxisMinimumFixedValue;
      if (!Content.VisualProperties.YAxisMaximumAuto && !double.IsNaN(Content.VisualProperties.YAxisMaximumFixedValue)) area.AxisY.Maximum = Content.VisualProperties.YAxisMaximumFixedValue;
      if (!Content.VisualProperties.SecondYAxisMinimumAuto && !double.IsNaN(Content.VisualProperties.SecondYAxisMinimumFixedValue)) area.AxisY2.Minimum = Content.VisualProperties.SecondYAxisMinimumFixedValue;
      if (!Content.VisualProperties.SecondYAxisMaximumAuto && !double.IsNaN(Content.VisualProperties.SecondYAxisMaximumFixedValue)) area.AxisY2.Maximum = Content.VisualProperties.SecondYAxisMaximumFixedValue;
      if (area.AxisX.Minimum >= area.AxisX.Maximum) area.AxisX.Maximum = area.AxisX.Minimum + 1;
      if (area.AxisX2.Minimum >= area.AxisX2.Maximum) area.AxisX2.Maximum = area.AxisX2.Minimum + 1;
      if (area.AxisY.Minimum >= area.AxisY.Maximum) area.AxisY.Maximum = area.AxisY.Minimum + 1;
      if (area.AxisY2.Minimum >= area.AxisY2.Maximum) area.AxisY2.Maximum = area.AxisY2.Minimum + 1;
    }
        public void DtBoxPlot(DataTable dtbp, DataTable dtsm, string XaxisName = "", string YaxisName = "", string AdditionalFilter = "", string AdditionalSpecFilter = "")
        {
            //Alternate chart reference http://www.codeproject.com/Articles/5431/A-flexible-charting-library-for-NET
            //Add title
            string title = SummaryMainClass.RestoreData(AdditionalFilter).Replace(" and ", "").Replace("= '", ":").Replace("'", ", ");
            if (title.Length > 1) title = title.Remove(title.Length - 2);
            if (chart1.Titles.Count == 0) chart1.Titles.Add(title);
            chart1.Titles[0].Text = title;

            //Init chart
            this.chart1.Legends.Clear();
            this.chart1.ChartAreas.Clear();
            this.chart1.Series.Clear();
            //Data area
            ChartArea area = new ChartArea("Area");
            this.chart1.ChartAreas.Add(area);

            string bpSeries = string.Empty;
            List<double> XValues = new List<double>();
            List<string> XActual = new List<string>();
            //Create Box Plot series
            int ZoomIndex = 10;
            //ZoomIndex = 200/dtbp.Columns.Count;
            int k = 1;
            for (int i = 0; i < dtbp.Columns.Count; i++)
            {
                //int i = dtbp.Columns.Count-1;
                string seriesName = dtbp.Columns[i].ToString();
                seriesName = seriesName.Replace("#", "");
                if (!seriesName.Contains("Spec") && seriesName.Contains("FullArray"))
                {
                    Series series = new Series(seriesName);
                    series.ChartArea = area.Name;
                    series.ChartType = SeriesChartType.Point;
                    series.Color = Color.Transparent;
                    series.ShadowColor = Color.Transparent;
                    series.BorderColor = Color.Transparent;
                    int j = 0;
                    double xval = new double();
                    foreach (DataRow dataRow in dtbp.Rows)
                    {
                        string[] strArr = dataRow[i].ToString().Split(',');
                        xval = k * ZoomIndex;
                        foreach (string str in strArr) if (str != "" & !str.Contains("Error")) { series.Points.AddXY(xval, Convert.ToDouble(str)); System.Diagnostics.Debug.Print(str + "\t"); } //System.Diagnostics.Debug.Print("bp" + xval + " " + str);//
                        j++;
                    }
                    this.chart1.Series.Add(series);
                    XValues.Add(xval);
                    XActual.Add(seriesName.Replace("FullArray", ""));
                    k++;
                    bpSeries = bpSeries + ";" + seriesName;
                }
            }
            k = 1;
            if (true)
            {
                //Create colors as per series
                int DataRows = 1;
                foreach (DataRow dataRow in dtbp.Rows)
                {
                    string seriesName = dtbp.Columns[1].ToString();
                    int startCol = 2;
                    if (seriesName.Contains("FullArray")) { seriesName = ""; startCol = 0; }
                    else { seriesName = seriesName + "=" + dataRow[1].ToString(); }
                    Series series = new Series(seriesName);
                    series.ChartArea = area.Name;
                    series.ChartType = SeriesChartType.Point;

                    //Combine columns to make the series data
                    k = 1;
                    for (int i = startCol; i < dtbp.Columns.Count; i++)
                    {
                        string[] strArr = dataRow[i].ToString().Split(',');
                        double xval = new double();
                        xval = k * ZoomIndex;
                        foreach (string str in strArr) if (str != "" & !str.Contains("Error")) { series.Points.AddXY(xval, Convert.ToDouble(str)); }//System.Diagnostics.Debug.Print("Se" + xval + " " + str);
                        k++;
                    }
                    //seriesArray.Add(series);
                    chart1.Series.Add(series);
                    //chart1.Series[chart1.Series.Count - 1].Color = CreateUniqueColors(chart1.Series.Count);
                    chart1.Series[chart1.Series.Count - 1].Color = CreateUniqueColors(DataRows);
                    //Enable Legend
                    var legendItem = new LegendItem();
                    legendItem.SeriesName = series.Name;
                    legendItem.ImageStyle = LegendImageStyle.Rectangle;
                    legendItem.Color = chart1.Series[chart1.Series.Count - 1].Color;
                    //legendItem.BorderColor = chart1.Series[chart1.Series.Count -1 ].Color; //series.Color; // Color.Transparent;
                    legendItem.Name = series.Name + "_legend_item";

                    int p = legendItem.Cells.Add(LegendCellType.SeriesSymbol, "", ContentAlignment.MiddleCenter);
                    legendItem.Cells.Add(LegendCellType.Text, series.Name, ContentAlignment.MiddleCenter);

                    if (series.Enabled)
                        legendItem.Color = CreateUniqueColors(DataRows); //Color.DarkBlue; //chart1.Series[chart1.Series.Count - 1].Color; // series.Color;
                    else
                        legendItem.Color = Color.FromArgb(100, series.Color);
                    chart1.Legends.Add(new Legend());
                    chart1.Legends.Add(new Legend());
                    chart1.Legends[0].Enabled = false;
                    chart1.Legends[1].CustomItems.Add(legendItem);
                    chart1.Legends[1].Enabled = true;
                    DataRows++;
                }
            }
            k = 1;
            if (false) //Old method Specific to Temp
                for (int i = 0; i < dtbp.Columns.Count; i++)
                {
                    string seriesName = dtbp.Columns[i].ToString();
                    seriesName = seriesName.Replace("#", "");
                    if (!seriesName.Contains("Spec"))
                    {
                        int j = 0;
                        double xval = new double();
                        foreach (DataRow dataRow in dtbp.Rows)
                        {
                            if (dataRow[i].ToString() != "")
                            {
                                seriesName = seriesName + j;
                                Series series = new Series(seriesName);
                                series.ChartArea = area.Name;
                                series.ChartType = SeriesChartType.Point;
                                if (dataRow[0].ToString() == "-40") series.Color = Color.DarkBlue;
                                if (dataRow[0].ToString() == "-10") series.Color = Color.Blue;
                                if (dataRow[0].ToString() == "25") series.Color = Color.Green;
                                if (dataRow[0].ToString() == "70") series.Color = Color.Pink;
                                if (dataRow[0].ToString() == "80") series.Color = Color.FromArgb(100, Color.Red);
                                if (dataRow[0].ToString() == "85") series.Color = Color.FromArgb(150, Color.Red);
                                if (dataRow[0].ToString() == "90") series.Color = Color.FromArgb(200, Color.Red);
                                if (dataRow[0].ToString() == "100") series.Color = Color.FromArgb(220, Color.Red);
                                if (dataRow[0].ToString() == "110") series.Color = Color.FromArgb(230, Color.Red);
                                if (dataRow[0].ToString() == "120") series.Color = Color.FromArgb(250, Color.Red);

                                this.chart1.Series.Add(series);
                                string[] strArr = dataRow[i].ToString().Split(',');
                                xval = k * ZoomIndex;
                                foreach (string str in strArr) if (str != "") series.Points.AddXY(xval, Convert.ToDouble(str));
                                j++;
                            }
                        }
                        k++;
                    }
                }
            if (bpSeries != "") bpSeries = bpSeries.Substring(1);

            area.AxisX.Title = SummaryMainClass.RestoreData(XaxisName);
            area.AxisY.Title = SummaryMainClass.RestoreData(YaxisName);

            //Temp series (Note this series has to be added BEFORE the BoxPlot series)
            Series tempSeries = new Series("TempSeries");
            tempSeries.ChartArea = area.Name;
            //To hide the series. Setting .Enabled = false will not have the desired effect.
            tempSeries.Color = Color.Transparent;
            tempSeries.Points.AddXY(1, 0); //XValue <> 0, so that it will not be treated as indexed
            this.chart1.Series.Add(tempSeries);

            //BoxPlot series
            Series seriesBox = new Series("BoxPlot");
            seriesBox.Color = Color.FromArgb(60, seriesBox.Color);
            // seriesBox.Palette = ChartColorPalette.SemiTransparent;

            seriesBox.ChartArea = area.Name;
            seriesBox.ChartType = SeriesChartType.BoxPlot;
            seriesBox["BoxPlotSeries"] = bpSeries;//combines series names "Series1;Series2;Series3";
            //seriesBox["BoxPlotShowMedian"] = "true";
            //seriesBox["BoxPlotShowAverage"] = "true";
            //seriesBox["BoxPlotShowUnusualValues"] = "true";
            seriesBox["BoxPlotWhiskerPercentile"] = "10";
            seriesBox["BoxPlotPercentile"] = "30";
            this.chart1.Series.Add(seriesBox);

            chart1.ApplyPaletteColors();

            double[] statistics = new double[] { };
            statistics = ApplyStatisticLines(dtsm, XValues, AdditionalFilter, AdditionalSpecFilter, YaxisName);

            //Get the min and max of chart scale from the plotted data
            //double xmin,ymin,xmax,ymax;
            //         xmin = Convert.ToDouble(chart1.Series[0].Points[0].XValue);
            //         xmax = xmin;
            //         ymin = Convert.ToDouble(chart1.Series[0].Points[0].YValues[0]);
            //         ymax = ymin;

            //     foreach (var series in chart1.Series)
            //     {
            //         foreach (var point in series.Points)
            //         {
            //             xmin = (xmin < Convert.ToDouble(point.XValue)) ? xmin : point.XValue;
            //             ymin = (ymin < Convert.ToDouble(point.YValues[0])) ? ymin : point.YValues[0];
            //             xmax = (xmax > Convert.ToDouble(point.XValue)) ? xmax : point.XValue;
            //             ymax = (ymax > Convert.ToDouble(point.YValues[0])) ? ymax : point.YValues[0];
            //            // point.Color = Color.FromArgb(220, point.Color);
            //         }
            //     }
            //Max(Range(Cells(1, 1), Cells(4, PT.PivotFields("Voltage1").PivotItems.Count)).Offset(row_count - 11, 1)) + (Max(Range(Cells(1, 1), Cells(4, PT.PivotFields("Voltage1").PivotItems.Count)).Offset(row_count - 11, 1)) - Min(Range(Cells(1, 1), Cells(4, PT.PivotFields("Voltage1").PivotItems.Count)).Offset(row_count - 11, 1))) / 20
            //Min(Range(Cells(1, 1), Cells(4, PT.PivotFields("Voltage1").PivotItems.Count)).Offset(row_count - 11, 1)) - (Max(Range(Cells(1, 1), Cells(4, PT.PivotFields("Voltage1").PivotItems.Count)).Offset(row_count - 11, 1)) - Min(Range(Cells(1, 1), Cells(4, PT.PivotFields("Voltage1").PivotItems.Count)).Offset(row_count - 11, 1))) / 20

            //Setup Grids
            area.AxisX.MajorGrid.Enabled = false;
            area.AxisY.MajorGrid.Enabled = false;
            area.AxisX.MinorGrid.Enabled = true;
            area.AxisX.MinorGrid.LineColor = Color.FromArgb(25, seriesBox.Color);
            area.AxisY.MinorGrid.Enabled = true;
            area.AxisY.MinorGrid.LineColor = Color.FromArgb(25, seriesBox.Color);
            area.AxisX.MinorGrid.Interval = 1;

            //To make the chart look nice...
            double minY = statistics.Min();
            double maxY = statistics.Max();

            System.Diagnostics.Debug.Print("min " + minY.ToString() + " Max " + maxY.ToString());

            area.RecalculateAxesScale();
            if ((minY - (maxY - minY) / 20).ToString() != "-Infinity") area.AxisY.Minimum = minY - (maxY - minY) / 20; //area.AxisY.Minimum;//22.4; //
            if ((maxY + (maxY - minY) / 20).ToString() != "Infinity") area.AxisY.Maximum = maxY + (maxY - minY) / 20; //area.AxisY.Maximum + area.AxisY.Maximum * 0.05;//23;//
            area.AxisX.Minimum = 0;// area.AxisX.Minimum;//
            if (XValues.Count > 1) area.AxisX.Maximum = XValues[XValues.Count - 1] + 6 * XValues[1];  //area.AxisX.Maximum;
            seriesBox["MaxPixelPointWidth"] = "20";

            double first = Convert.ToDouble(System.Text.RegularExpressions.Regex.Match(XValues[0].ToString(), @"\d+").Value);
            var XAxis = chart1.ChartAreas[0].AxisX;

            double StartPos = Convert.ToDouble(System.Text.RegularExpressions.Regex.Match(XValues[0].ToString(), @"\d+").Value);
            double EndPos = new int();

            //Truncate the Y axis Values
            chart1.ChartAreas[0].AxisY.LabelStyle.TruncatedLabels = true;

            int icount = 0;
            int labelWidth = 5; //1
            if (XActual.Count > 10) labelWidth = 5;
            if (XActual.Count > 15) labelWidth = 8;
            foreach (int Xval in XValues)
            {
                EndPos = StartPos + labelWidth;

                //chart1.ChartAreas[0].AxisX.CustomLabels.Add(StartPos, EndPos, XActual[icount].ToString(), 0, LabelMarkStyle.None); //StartPos.ToString("f") replaced with  XActual[icount].ToString()
                chart1.ChartAreas[0].AxisX.CustomLabels.Add(StartPos, EndPos, XActual[icount].ToString(), 0, LabelMarkStyle.Box);
                StartPos = Xval + ZoomIndex;
                icount++;
            }
            ChartRedraw();
            return;
        }