using System; using System.Drawing; using System.Windows.Forms; using System.Windows.Forms.DataVisualization.Charting; namespace FeatureVectorCalculator { public class SignalChart { public static Chart GetChart(float[] data, float period, string caption, string captionY, bool fromZero = true, PointF[] extendedOutliers = null, PointF[] outliers = null) { Series series1 = null, series2 = null, series3 = null; series1 = new Series { Name = caption, ChartArea = "area1", ChartType = SeriesChartType.Line, Color = Color.DeepSkyBlue }; float minY = float.MaxValue; float maxY = float.MinValue; for (int x = 0; x < data.Length; x++) { float y = data[x]; if (minY > y) minY = y; if (maxY < y) maxY = y; series1.Points.AddXY(x * period, y); } if (extendedOutliers != null) { series2 = new Series { Name = "extended outliers", ChartArea = "area1", ChartType = SeriesChartType.Point, Color = Color.Yellow }; for (int i = 0; i < extendedOutliers.Length; i++) { series2.Points.AddXY(extendedOutliers[i].X * period, extendedOutliers[i].Y); } } if (outliers != null) { series3 = new Series { Name = "outliers", ChartArea = "area1", ChartType = SeriesChartType.Point, Color = Color.DarkRed }; for (int i = 0; i < outliers.Length; i++) { series3.Points.AddXY(outliers[i].X * period, outliers[i].Y); } } ChartArea chArea = new ChartArea { Name = "area1" }; chArea.AxisX.Title = "Time [s]"; chArea.AxisX.IsLogarithmic = false; chArea.AxisX.IsLabelAutoFit = true; chArea.AxisX.Minimum = 0; chArea.AxisX.Maximum = (data.Length - 1) * period; // for (int j = i; j < i + 3; j++) // { // CustomLabel cl = new CustomLabel(); // cl.Text = string.Format("{0} {1}", xs[j], flowUnit.ToDescription()); // cl.FromPosition = Math.Log10(xs[j] * spacer); // cl.ToPosition = Math.Log10(xs[j] / spacer); // chArea.AxisX.CustomLabels.Add(cl); // } chArea.AxisY.Title = captionY; chArea.AxisY.IsLogarithmic = false; chArea.AxisY.IsLabelAutoFit = true; if (!fromZero) { /// fromZero = false chArea.AxisY.IsStartedFromZero = false; float diff = maxY - minY; chArea.AxisY.Minimum = minY - 0.05 * diff; chArea.AxisY.Maximum = maxY + 0.05 * diff; } else if (minY >= 0) { /// fromZero = true, All points are above zero chArea.AxisY.IsStartedFromZero = true; chArea.AxisY.Minimum = 0; chArea.AxisY.Maximum = 1.05 * maxY; } else if (maxY <= 0) { /// fromZero = true, All points are below zero chArea.AxisY.IsStartedFromZero = true; chArea.AxisY.Minimum = 1.05 * minY; chArea.AxisY.Maximum = 0; } else { /// Points are both below and above zero chArea.AxisY.IsStartedFromZero = false; float diff = maxY - minY; chArea.AxisY.Minimum = minY - 0.05 * diff; chArea.AxisY.Maximum = maxY + 0.05 * diff; } if (chArea.AxisY.Maximum == chArea.AxisY.Minimum) { chArea.AxisY.Maximum = chArea.AxisY.Maximum + 1; } Chart chart = new Chart { Text = caption, Dock = DockStyle.Fill }; chart.ChartAreas.Add(chArea); chart.Series.Add(series1); if (series2 != null) chart.Series.Add(series2); if (series3 != null) chart.Series.Add(series3); return chart; } } }