public void CreateUniformBins_BasicTest() { // arbitrary unpleasent numbers var start = -0.123456789E10; var end = 0.987654321E10; var counts = new[] { 13, 17, 113, 1023, 1234567, 1234569 }; foreach (var count in counts) { var breaks = HistogramHelpers.CreateUniformBins(start, end, count); // ensure that CreateUniformBins gives back the exact same start and end Assert.AreEqual(count + 1, breaks.Count); Assert.AreEqual(breaks[0], start); Assert.AreEqual(breaks[count], end); // ensure the gab between breaks is reasonably consistent double expectedGap = (end - start) / count; for (int i = 0; i < count; i++) { double gap = breaks[i + 1] - breaks[i]; Assert.AreEqual(expectedGap, gap, 1E-5); // near limits of resoltuion } } }
public static PlotModel CreateIndividualBinColors(double mean = 1, int n = 10000) { var model = new PlotModel { Title = "Individual Bin Colors", Subtitle = "Minimum is Red, Maximum is Green" }; model.Axes.Add(new LinearAxis { Position = AxisPosition.Left, Title = "Frequency" }); model.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom, Title = "Observation" }); Random rnd = new Random(1); HistogramSeries chs = new HistogramSeries() { FillColor = OxyColors.Gray, RenderInLegend = true, Title = "Measurements" }; var binningOptions = new BinningOptions(BinningOutlierMode.CountOutliers, BinningIntervalType.InclusiveLowerBound, BinningExtremeValueMode.ExcludeExtremeValues); var binBreaks = HistogramHelpers.CreateUniformBins(0, 10, 20); var bins = HistogramHelpers.Collect(SampleUniform(rnd, 0, 10, 1000), binBreaks, binningOptions).OrderBy(b => b.Count).ToArray(); bins.First().Color = OxyColors.Red; bins.Last().Color = OxyColors.Green; chs.Items.AddRange(bins); chs.StrokeThickness = 1; model.Series.Add(chs); return(model); }
public static PlotModel CreateExponentialDistribution(double mean = 1, int n = 10000) { var model = new PlotModel { Title = "Exponential Distribution", Subtitle = "Uniformly distributed bins (" + n + " samples)" }; model.Axes.Add(new LinearAxis { Position = AxisPosition.Left, Title = "Frequency" }); model.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom, Title = "x" }); Random rnd = new Random(1); HistogramSeries chs = new HistogramSeries(); var binningOptions = new BinningOptions(BinningOutlierMode.CountOutliers, BinningIntervalType.InclusiveLowerBound, BinningExtremeValueMode.ExcludeExtremeValues); var binBreaks = HistogramHelpers.CreateUniformBins(0, 5, 15); chs.Items.AddRange(HistogramHelpers.Collect(SampleExps(rnd, 1.0, n), binBreaks, binningOptions)); chs.StrokeThickness = 1; model.Series.Add(chs); return(model); }
public void CreateUniformBins_SingleBin() { var start = double.Epsilon; var end = 1.0; var breaks = HistogramHelpers.CreateUniformBins(start, end, 1); Assert.AreEqual(2, breaks.Count); Assert.AreEqual(breaks[0], start); Assert.AreEqual(breaks[1], end); }
public void CreateUniformBins_InvalidParameters() { // explicitly disallow extreme values for start and end Assert.Throws(typeof(ArgumentException), () => HistogramHelpers.CreateUniformBins(double.NaN, 0.0, 5)); Assert.Throws(typeof(ArgumentException), () => HistogramHelpers.CreateUniformBins(double.NegativeInfinity, 0.0, 5)); Assert.Throws(typeof(ArgumentException), () => HistogramHelpers.CreateUniformBins(double.PositiveInfinity, 0.0, 5)); Assert.Throws(typeof(ArgumentException), () => HistogramHelpers.CreateUniformBins(0.0, double.NaN, 5)); Assert.Throws(typeof(ArgumentException), () => HistogramHelpers.CreateUniformBins(0.0, double.NegativeInfinity, 5)); Assert.Throws(typeof(ArgumentException), () => HistogramHelpers.CreateUniformBins(0.0, double.PositiveInfinity, 5)); // disallow binCount < 1 Assert.Throws(typeof(ArgumentException), () => HistogramHelpers.CreateUniformBins(0.0, 1.0, -100)); Assert.Throws(typeof(ArgumentException), () => HistogramHelpers.CreateUniformBins(0.0, 1.0, 0)); // disallow start >= end Assert.Throws(typeof(ArgumentException), () => HistogramHelpers.CreateUniformBins(1.0, 0.0, 5)); Assert.Throws(typeof(ArgumentException), () => HistogramHelpers.CreateUniformBins(1.0, 1.0, 5)); }
public static PlotModel CreateNormalDistribution(double mean = 0, double std = 1, int n = 1000000) { var model = new PlotModel { Title = $"Normal Distribution (μ={mean}, σ={std})", Subtitle = "95% of the distribution (" + n + " samples)" }; model.Axes.Add(new LinearAxis { Position = AxisPosition.Left, Title = "Frequency" }); model.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom, Title = "x" }); Random rnd = new Random(); HistogramSeries chs = new HistogramSeries(); var binningOptions = new BinningOptions(BinningOutlierMode.CountOutliers, BinningIntervalType.InclusiveLowerBound, BinningExtremeValueMode.ExcludeExtremeValues); var binBreaks = HistogramHelpers.CreateUniformBins(-std * 4, std * 4, 100); chs.Items.AddRange(HistogramHelpers.Collect(SampleNormal(rnd, mean, std, n), binBreaks, binningOptions)); chs.StrokeThickness = 1; double LimitHi = mean + 1.96 * std; double LimitLo = mean - 1.96 * std; OxyColor ColorHi = OxyColors.DarkRed; OxyColor ColorLo = OxyColors.DarkRed; chs.ColorMapping = (item) => { if (item.RangeCenter > LimitHi) { return(ColorHi); } else if (item.RangeCenter < LimitLo) { return(ColorLo); } return(chs.ActualFillColor); }; model.Series.Add(chs); return(model); }
public void CreateUniformBins_IntegerBins() { int[] primes = new int[] { 1, 2, 3, 5, 7, 11, 13, 17 }; // ensure we produce nice integer results over a reasonable range int end = primes.Aggregate((a, b) => a * b); int start = -end; foreach (var interval in primes) { int count = (end - start) / interval; var breaks = HistogramHelpers.CreateUniformBins(start, end, count); Assert.AreEqual(count, breaks.Count - 1); int i = 0; for (int b = start; b <= end; b += interval, i++) { Assert.AreEqual(b, breaks[i]); } } }
public static PlotModel HistogramSeries() { // prepare the model var model = new PlotModel() { Title = "Cubic Distribution", LegendPlacement = LegendPlacement.Outside, LegendPosition = LegendPosition.TopCenter, LegendOrientation = LegendOrientation.Horizontal }; // add two linear axes model.Axes.Add(new LinearAxis() { Title = "Observation", Position = AxisPosition.Bottom }); model.Axes.Add(new LinearAxis() { Title = "Frequency", Position = AxisPosition.Left }); // generate random samples from a polynomial distribution double power = 3; double max = 10.0; int sampleCount = 1000; double integral = Math.Pow(max, power + 1) / (power + 1); var rnd = new Random(0); List <double> samples = new List <double>(); for (int i = 0; i < sampleCount; i++) { samples.Add(Math.Pow(rnd.NextDouble() * (power + 1) * integral, 1.0 / (power + 1))); } // plot histogram of samples var histogramSeries = new HistogramSeries() { Title = $"Empirical Distribution", FillColor = OxyColors.Green, StrokeColor = OxyColors.Black, StrokeThickness = 2 }; var bins = HistogramHelpers.CreateUniformBins(0, max, 20); var binningOptions = new BinningOptions(BinningOutlierMode.RejectOutliers, BinningIntervalType.InclusiveLowerBound, BinningExtremeValueMode.IncludeExtremeValues); var items = HistogramHelpers.Collect(samples, bins, binningOptions); histogramSeries.Items.AddRange(items); model.Series.Add(histogramSeries); // plot ideal line for comparison var functionSeries = new FunctionSeries(x => Math.Pow(x, power) / integral, 0, max, 1000) { Title = "Ideal Distribution", Color = OxyColors.Red }; model.Series.Add(functionSeries); return(model); }