public static BoxPlotItem Box(double x, IEnumerable <double> samples) { var sorted = samples.OrderBy(s => s).ToArray(); var lq = Terp(sorted, 0.25); var median = Terp(sorted, 0.5); var uq = Terp(sorted, 0.75); var mean = sorted.Average(); var lt = lq - (median - lq) * 1.5; var ut = uq + (uq - median) * 1.5; var low = Math.Min(samples.Where(s => s >= lt).Min(), lq); var high = Math.Max(samples.Where(s => s <= ut).Max(), uq); var bpi = new BoxPlotItem(x, low, lq, median, uq, high) { Mean = mean }; foreach (var o in sorted.Where(s => s <low || s> high)) { bpi.Outliers.Add(o); } return(bpi); }
private void AddItem(PlotModel plotModel, List<double> values, int slot) { values.Sort(); var sorted = values.ToArray(); var median = sorted.Median(); int r = values.Count % 2; var firstQuartile = sorted.LowerQuartile(); var thirdQuartile = sorted.UpperQuartile(); var interQuartileRange = thirdQuartile - firstQuartile; var step = interQuartileRange * 1.5; var upperWhisker = thirdQuartile + step; upperWhisker = values.Where(v => v <= upperWhisker).Max(); var lowerWhisker = firstQuartile - step; lowerWhisker = values.Where(v => v >= lowerWhisker).Min(); var outliers = values.Where(v => v > upperWhisker || v < lowerWhisker).ToList(); var item = new BoxPlotItem(slot, lowerWhisker, firstQuartile, median, thirdQuartile, upperWhisker) { Outliers = outliers }; if (outliers.Any()) { (plotModel.Series[1] as BoxPlotSeries).Items.Add(item); } else { (plotModel.Series[0] as BoxPlotSeries).Items.Add(item); } }
public void TestSimpleCase() { object[] x = new object[7] { 0d, 1d, 2d, 3d, 4d, 5d, 6d }; object[] y = new object[7] { 0d, 1d, 1d, 2d, 3d, 3d, 4d }; Line line = new Line(LineType.Solid, LineThickness.Normal); Marker marker = new Marker(MarkerType.FilledSquare, MarkerSize.Normal, 1); BoxWhiskerSeries series = new BoxWhiskerSeries("Title", Color.Red, true, x, y, line, marker, "", ""); var oxySeries = exporter.Export(series, AxisLabelCollection.Empty()).Result; Assert.NotNull(oxySeries); Assert.True(oxySeries is BoxPlotSeries); BoxPlotSeries boxPlot = (BoxPlotSeries)oxySeries; // Line style Assert.AreEqual(OxyPlot.LineStyle.Solid, boxPlot.LineStyle); Assert.AreEqual(0.5, boxPlot.StrokeThickness); // Marker style Assert.AreEqual(OxyPlot.MarkerType.Square, boxPlot.OutlierType); Assert.AreEqual(7, boxPlot.OutlierSize); // Colours Assert.AreEqual(OxyColors.Transparent, boxPlot.Stroke); Assert.AreEqual(OxyColors.Red, boxPlot.Fill); // Title Assert.AreEqual("Title", boxPlot.Title); // Contents of series. Assert.AreEqual(1, boxPlot.Items.Count); BoxPlotItem item = boxPlot.Items[0]; Assert.NotNull(item); // Test box plot whisker values. Assert.AreEqual(0, item.X); Assert.AreEqual(0, item.LowerWhisker); Assert.AreEqual(1, item.BoxBottom); Assert.AreEqual(2, item.Median); Assert.AreEqual(3, item.BoxTop); Assert.AreEqual(4, item.UpperWhisker); }
private void FillCollection(Collection <BoxPlotItem> collection, List <IntBarSensorData> list) { foreach (var boxValue in list) { int firstQuant = boxValue.Percentiles.FirstOrDefault(p => Math.Abs(p.Percentile - 0.25) < double.Epsilon).Value; int thirdQuant = boxValue.Percentiles.FirstOrDefault(p => Math.Abs(p.Percentile - 0.75) < double.Epsilon).Value; int median = boxValue.Percentiles.FirstOrDefault(p => Math.Abs(p.Percentile - 0.5) < double.Epsilon).Value; double lowerWhisker = firstQuant - (1.5 * (thirdQuant - firstQuant)); double upperWhisker = thirdQuant + (1.5 * (thirdQuant - firstQuant)); //DateTime time = new DateTime(1970, 1, 1).AddMilliseconds(boxValue.StartTime.ToUniversalTime().ToTimestamp().Seconds); double x = DateTimeAxis.ToDouble(boxValue.StartTime); BoxPlotItem plotItem = new BoxPlotItem(x, lowerWhisker, firstQuant, median, thirdQuant, upperWhisker); plotItem.Mean = boxValue.Mean; collection.Add(plotItem); } }
private BoxPlotItem GetBox(FieldViewModel field, int index) { double[] data = field.ControlPoints .OrderBy(cp => cp.Penalty) .Select(cp => cp.Penalty) .ToArray(); var box = new BoxPlotItem { X = index, LowerWhisker = data.Quantile(0.02), BoxBottom = data.LowerQuartile(), Median = data.Median(), BoxTop = data.UpperQuartile(), UpperWhisker = data.Quantile(0.98) }; box.Outliers = data.Where(d => d <box.LowerWhisker || d> box.UpperWhisker).ToList(); return(box); }