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; }