示例#1
0
        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
                }
            }
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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));
        }
示例#6
0
        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);
        }
示例#7
0
        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);
        }