internal void Update(VisualOdometer visualOdometer) { if (!this.Created) { return; } List <double> headingChanges = visualOdometer.RotationAnalyzer.MeasuredRotationIncrements; if (headingChanges.Count == 0) { return; } double[] degreeAngles = new double[headingChanges.Count]; for (int i = 0; i < headingChanges.Count; i++) { degreeAngles[i] = headingChanges[i] * s_RadToDegree; } m_Histogram.Fill(degreeAngles); m_HistogramSeries.Points.Clear(); for (int i = 0; i < m_Histogram.BinsCount; i++) { HistogramBin bin = m_Histogram[i]; // Add data point into the histogram series double x = (bin.Min + bin.Max) / 2.0; m_HistogramSeries.Points.AddXY(x, bin.Count); } m_CurrentHeadingChangeSeries.Points.Clear(); m_CurrentHeadingChangeSeries.Points.AddXY(visualOdometer.RotationAnalyzer.HeadingChange.Degrees, 0); m_CurrentHeadingChangeAnnotation.AnchorDataPoint = m_CurrentHeadingChangeSeries.Points[0]; }
public static HistogramBin[] Histogram(this IList <MetaNum> self, int binCount = -1, double binWidth = double.NaN) { var min = (double)self.Min(); var max = (double)self.Max(); HistogramInterval intervals; if (!double.IsNaN(binWidth)) { intervals = HistogramHelper.GetHistogramIntervalFromBinWidth(min, max, binWidth); } else { if (binCount < 0) { binCount = HistogramHelper.GetBinCount(min, max, self.Count); } intervals = HistogramHelper.GetHistogramIntervalFromBinCount(min, max, binCount); } var collect = CollectHistogram(self, intervals); var counts = collect.Item1; var total = collect.Item2; return(HistogramBin.CreateHistogram(intervals, counts, total)); }
public static PlotModel CreateNormalDistributionHistogram(int n, int binCount) { var bins = new HistogramBin[binCount]; double min = -10; double max = 10; for (int i = 0; i < bins.Length; i++) { var v = min + (max - min) * i / (bins.Length - 1); bins[i] = new HistogramBin { Label = v.ToString("0.0") }; } var r = new Random(31); for (int i = 0; i < n; i++) { // http://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform var u1 = r.NextDouble(); var u2 = r.NextDouble(); var v = Math.Sqrt(-2 * Math.Log(u1)) * Math.Cos(2 * Math.PI * u2); int bin = (int)Math.Round((v - min) / (max - min) * (bins.Length - 1)); if (bin >= 0 && bin < bins.Length) { bins[bin].Value++; } } var temp = new PlotModel { Title = string.Format("Histogram (bins={0}, n={1})", binCount, n), Subtitle = "Standard normal distribution by Box-Muller transform" }; var series1 = new TSeries { ItemsSource = bins, ValueField = "Value" }; temp.Series.Add(series1); var categoryAxis = new CategoryAxis { Position = CategoryAxisPosition(), GapWidth = 0 }; categoryAxis.Labels.AddRange(bins.Select(b => b.Label)); categoryAxis.IsAxisVisible = false; temp.Axes.Add(categoryAxis); // todo: link category and linear axis temp.Axes.Add(new LinearAxis { Position = CategoryAxisPosition(), Minimum = min, Maximum = max }); temp.Axes.Add(new LinearAxis { Position = ValueAxisPosition(), MinimumPadding = 0, AbsoluteMinimum = 0 }); return(temp); }
private void InitializeHistogramChart() { m_HistogramSeries = m_Chart.Series.Add("Histogram"); // Set new series chart type and other attributes m_HistogramSeries.ChartType = SeriesChartType.Column; m_HistogramSeries.BorderColor = Color.Black; m_HistogramSeries.BorderWidth = 1; m_HistogramSeries.BorderDashStyle = ChartDashStyle.Solid; m_HistogramSeries["PointWidth"] = "1.0"; m_HistogramSeries["BarLabelStyle"] = "Center"; // Adjust chart area ChartArea chartArea = m_Chart.ChartAreas[m_HistogramSeries.ChartArea]; //chartArea.AxisY.Title = "Frequency"; chartArea.AxisX.Minimum = 3; chartArea.AxisX.Maximum = 18; //Series series1 = new Series(); //m_Chart.Series.Add(series1); //for (int index = 3; index < 19; index++) //{ // m_HistogramSeries.Points.AddXY(index, 2 * index); //} for (int i = 0; i < m_Data.Histogram.BinsCount; i++) { HistogramBin bin = m_Data.Histogram[i]; // Add data point into the histogram series double x = (bin.Min + bin.Max) / 2.0; m_HistogramSeries.Points.AddXY(x, bin.Count); } }
public static PlotModel CreateHistogram(int n, int binCount) { var bins = new HistogramBin[binCount]; for (int i = 0; i < bins.Length; i++) { bins[i] = new HistogramBin { Label = i.ToString() }; } var r = new Random(31); for (int i = 0; i < n; i++) { int value = r.Next(binCount); bins[value].Value++; } var temp = new PlotModel { Title = string.Format("Histogram (bins={0}, n={1})", binCount, n), Subtitle = "Pseudorandom numbers" }; var series1 = new TSeries { ItemsSource = bins, ValueField = "Value" }; if (binCount < 100) { series1.LabelFormatString = "{0}"; } temp.Series.Add(series1); temp.Axes.Add(new CategoryAxis { Position = CategoryAxisPosition(), ItemsSource = bins, LabelField = "Label", GapWidth = 0 }); temp.Axes.Add(new LinearAxis { Position = ValueAxisPosition(), MinimumPadding = 0, MaximumPadding = 0.1, AbsoluteMinimum = 0 }); return(temp); }
public static List <HistogramBin> BinData(List <double> theData, double minBin, double maxBin, int noBins, bool discardValuesBeyondMinMax) { if (discardValuesBeyondMinMax) { int itemsRemoved = theData.RemoveAll(a => a <minBin || a> maxBin); //Console.WriteLine(itemsRemoved + " items removed when generating histogram; out of bounds"); } List <HistogramBin> histogramBins = new List <HistogramBin>(noBins); theData.Sort(); double interval = (maxBin - minBin) / noBins; double intervalFloor = minBin; //Create all bins for (double i = 0; i <= noBins; i++) { histogramBins.Add(new HistogramBin(minBin + i * interval)); } //Fill the bins foreach (double d in theData) { HistogramBin b = histogramBins.Find(a => a.IntervalFloor > d && d < a.IntervalFloor + interval); try { b.TheData.Add(d); } catch { Console.WriteLine("Null Bin"); } } Normalize(histogramBins); return(histogramBins); }
public static List <HistogramBin> BinData(List <double> theData, int noBins) { if (theData.Count == 0) { throw new Exception("No datapoint provided for binning"); } List <HistogramBin> histogramBins = new List <HistogramBin>(noBins); double min = theData.Min(); double max = theData.Max(); double delta = max - min; double step = delta / noBins; theData.Sort(); double intervalFloor = double.MinValue; HistogramBin hb = new HistogramBin(0); //Fill the bins intervalFloor = min; foreach (double datapoint in theData) { if (datapoint > (intervalFloor + step)) { hb = new HistogramBin(datapoint); hb.TheData.Add(datapoint); histogramBins.Add(hb); intervalFloor += step; } else { hb.TheData.Add(datapoint); } } Normalize(histogramBins); return(histogramBins); }
public static List <HistogramBin> BinData(List <int> theData) { if (theData.Count == 0) { throw new Exception("No datapoint provided for binning"); } List <HistogramBin> histogramBins = new List <HistogramBin>(); var groups = from integer in theData group integer by integer into theBin select new { theBin.Key, theBin }; foreach (var group in groups) { HistogramBin h = new HistogramBin((double)group.Key); h.TheData = group.theBin.Select(a => (double)a).ToList(); histogramBins.Add(h); } return(histogramBins); }
public static HistogramBin[] Histogram <T>(this IEnumerable <T> list, Func <T, float> select, int bins) { var result = new HistogramBin[bins]; var min = list.Min(v => select(v)); var max = list.Max(v => select(v)); if (min == max) { return(result); } for (int i = 0; i < bins; ++i) { result[i].Start = i * ((max - min) / bins) + min; } foreach (var one in list) { var ix = Math.Min(result.Length - 1, (int)((bins * (select(one) - min)) / (max - min))); ++result[ix].Count; } return(result); }
public static PlotModel Histogram() { int n = 1000; int binCount = 20; var bins = new HistogramBin[binCount]; for (int i = 0; i < bins.Length; i++) { bins[i] = new HistogramBin { Label = i.ToString() }; } var r = new Random(); for (int i = 0; i < n; i++) { int value = r.Next(binCount); bins[value].Value++; } var temp = new PlotModel(); var series1 = new TSeries { ItemsSource = bins, ValueField = "Value" }; temp.Series.Add(series1); temp.Axes.Add(new CategoryAxis { Position = CategoryAxisPosition(), ItemsSource = bins, LabelField = "Label", GapWidth = 0 }); temp.Axes.Add(new LinearAxis { Position = ValueAxisPosition(), MinimumPadding = 0, AbsoluteMinimum = 0 }); return(temp); }
public static HistogramBin[] Histogram <T>(this IEnumerable <T> list, Func <T, float> select, int bins, float lowerabsdevs = float.MaxValue, float upperabsdevs = float.MaxValue) { if (list == null || !list.Any()) { return(default(HistogramBin[])); } var dbgcount = list.Count(); var result = new HistogramBin[bins]; float avg = 0f; float absdev = 0f; var values = list.Select(v => select(v)); if (lowerabsdevs != float.MaxValue || upperabsdevs != float.MaxValue) { avg = values.Average(); absdev = values.AbsDev(); } var min = values.Min(); var max = values.Max(); if (lowerabsdevs != float.MaxValue && list.Count() > 3) { min = Math.Max(avg - absdev * lowerabsdevs, min); } if (upperabsdevs != float.MaxValue && list.Count() > 3) { max = Math.Min(avg + absdev * upperabsdevs, max); } if (min == max) { return(result); } for (int i = 0; i < bins; ++i) { result[i].Start = i * ((max - min) / bins) + min; } foreach (var one in values) { var val = one; if (lowerabsdevs != float.MaxValue && list.Count() > 3) { val = Math.Max(avg - absdev * lowerabsdevs, val); } if (upperabsdevs != float.MaxValue && list.Count() > 3) { val = Math.Min(avg + absdev * upperabsdevs, val); } var ix = Math.Max(0, Math.Min( result.Length - 1, (int)((bins * (val - min)) / (max - min)))); ++result[ix].Count; } return(result); }