public void Test_SMA_Candlestick()
        {
            Random rand = new Random(0);

            double[] xs    = DataGen.Consecutive(150);
            OHLC[]   ohlcs = DataGen.RandomStockPrices(rand, xs.Length);

            // create SMAs and Xs for each
            double[] sma20   = ScottPlot.Statistics.Finance.SMA(ohlcs, 20);
            double[] sma20xs = xs.Skip(20).ToArray();
            double[] sma50   = ScottPlot.Statistics.Finance.SMA(ohlcs, 50);
            double[] sma50xs = xs.Skip(50).ToArray();

            // replace timestamps with a series of numbers starting at 0
            for (int i = 0; i < ohlcs.Length; i++)
            {
                ohlcs[i].DateTime = DateTime.FromOADate(i);
            }

            var plt = new ScottPlot.Plot(600, 400);

            plt.AddCandlesticks(ohlcs);
            plt.AddScatter(sma20xs, sma20, label: "20 day SMA",
                           color: Color.Blue, markerSize: 0, lineWidth: 2);
            plt.AddScatter(sma50xs, sma50, label: "50 day SMA",
                           color: Color.Maroon, markerSize: 0, lineWidth: 2);

            plt.Title("Simple Moving Average (SMA)");
            plt.YLabel("Price");
            plt.XLabel("Days");
            plt.Legend();
            plt.AxisAutoX(.03);
            TestTools.SaveFig(plt);
        }
        public void Test_Bollinger_Bands()
        {
            Random rand = new Random(0);

            double[] xs    = DataGen.Consecutive(150);
            OHLC[]   ohlcs = DataGen.RandomStockPrices(rand, xs.Length);

            // calculate moving average X and Ys
            (var sma, var bolL, var bolU) = ScottPlot.Statistics.Finance.Bollinger(ohlcs, 20);
            double[] xs2 = xs.Skip(20).ToArray();

            // replace timestamps with a series of numbers starting at 0
            for (int i = 0; i < ohlcs.Length; i++)
            {
                ohlcs[i].DateTime = DateTime.FromOADate(i);
            }

            var plt = new ScottPlot.Plot(600, 400);

            plt.AddCandlesticks(ohlcs);
            plt.AddFill(xs2, bolL, xs2, bolU, color: Color.FromArgb(10, Color.Blue));
            plt.AddScatter(xs2, bolL, color: Color.Navy, markerSize: 0, label: "Bollinger Bands");
            plt.AddScatter(xs2, bolU, color: Color.Navy, markerSize: 0);
            plt.AddScatter(xs2, sma, color: Color.Navy, markerSize: 0, lineStyle: LineStyle.Dash, label: "SMA 20");

            plt.Title("Moving Average and Standard Deviation");
            plt.YLabel("Price");
            plt.XLabel("Days");
            plt.Legend();
            plt.AxisAutoX(.03);
            TestTools.SaveFig(plt);
        }
Exemple #3
0
        public void SaveScottPlotTestFromWebsite()
        {
            string saveFileLocation = "C:\\Temp\\Quickstart_Quickstart_Scatter.png";
            var    plt = new ScottPlot.Plot(600, 400);

            int pointCount = 51;

            double[] xs  = DataGen.Consecutive(pointCount);
            double[] sin = DataGen.Sin(pointCount);
            double[] cos = DataGen.Cos(pointCount);

            plt.AddScatter(sin, cos, label: "sin");
            plt.AddScatter(xs, cos, label: "cos");
            plt.Legend();

            plt.Title("Scatter Plot Quickstart");
            plt.YLabel("Vertical Units");
            plt.XLabel("Horizontal Units");

            plt.SaveFig(saveFileLocation);

            Assert.IsTrue(System.IO.File.Exists(saveFileLocation));

            System.IO.File.Delete(saveFileLocation);
        }
Exemple #4
0
    public void Test_BasicPlot_CanRender()
    {
        double[] xs  = ScottPlot.Generate.Consecutive(51);
        double[] ys1 = ScottPlot.Generate.Sin(51);
        double[] ys2 = ScottPlot.Generate.Cos(51);

        var plt = new ScottPlot.Plot();

        plt.AddScatter(xs, ys1);
        plt.AddScatter(xs, ys2);

        TestIO.SaveFig(plt);
    }
Exemple #5
0
        private ScottPlot.Plot GetDemoPlot()
        {
            Random rand = new Random(0);
            var    plt  = new ScottPlot.Plot();

            plt.AddScatter(DataGen.Random(rand, 100, 20), DataGen.Random(rand, 100, 5, 3), label: "scatter1");
            plt.AddSignal(DataGen.RandomWalk(rand, 100), label: "signal1");
            plt.AddScatter(DataGen.Random(rand, 100), ScottPlot.DataGen.Random(rand, 100), label: "scatter2");
            plt.AddSignal(DataGen.RandomWalk(rand, 100), label: "signal2");
            plt.AddVerticalLine(43, width: 4, label: "vline");
            plt.AddHorizontalLine(1.23, width: 4, label: "hline");
            plt.AddText("ScottPlot", 50, 0.25);
            plt.Legend();
            return(plt);
        }
Exemple #6
0
        public void Test_TickAlignment_SnapEdgePixel()
        {
            Random rand = new Random(0);

            double[] xs = DataGen.Range(0, 10, .1, true);
            double[] ys = DataGen.RandomWalk(rand, xs.Length, .5);

            var plt = new ScottPlot.Plot(320, 240);

            plt.AddScatter(xs, ys, markerSize: 0);
            plt.AddScatter(ys, xs, markerSize: 0);
            plt.AxisAuto(0, 0);

            TestTools.SaveFig(plt);
        }
Exemple #7
0
        public void Test_scatter_benchmark()
        {
            int[]     pointCounts = { 1000, 100, 10 };
            const int REPS        = 10;

            Random rand = new(0);

            for (int i = 0; i < pointCounts.Length; i++)
            {
                int      pointCount = pointCounts[i];
                var      plt        = new ScottPlot.Plot();
                double[] xs         = DataGen.Random(rand, pointCount);
                double[] ys         = DataGen.RandomWalk(rand, pointCount);
                plt.AddScatter(xs, ys);
                plt.Render(lowQuality: true);

                for (int j = 0; j < REPS; j++)
                {
                    plt.Render(lowQuality: true);
                }

                double[] renderTimes = plt.BenchmarkTimes();
                Assert.AreEqual(REPS + 1, renderTimes.Length);

                double meanTime = renderTimes.Sum() / renderTimes.Length;
                Console.WriteLine($"Rendered {pointCount} points in {meanTime:N2} ms (n={renderTimes.Length})");
            }
        }
        public void Test_DefinedSpacing_NumericAxis()
        {
            int pointCount = 20;

            // create a series of day numbers
            double[] days = ScottPlot.DataGen.Consecutive(pointCount);

            // simulate data for each date
            double[] values = new double[pointCount];
            Random   rand   = new Random(0);

            for (int i = 1; i < pointCount; i++)
            {
                values[i] = values[i - 1] + rand.NextDouble();
            }


            var pltDefault = new ScottPlot.Plot();

            pltDefault.Title("Default xSpacing");
            pltDefault.AddScatter(days, values);

            var pltTest = new ScottPlot.Plot();

            pltTest.Title("xSpacing = 1 unit");
            pltTest.AddScatter(days, values);

            // force inter-tick distance on a numerical axis
            pltTest.XAxis.ManualTickSpacing(1);

            //TestTools.SaveFig(pltDefault);
            //TestTools.SaveFig(pltTest);
        }
Exemple #9
0
        public void Test_Scatter_Offset()
        {
            Random rand = new(0);

            double[] xs = DataGen.Random(rand, 20);
            double[] ys = DataGen.Random(rand, 20);

            var plt     = new ScottPlot.Plot(400, 300);
            var scatter = plt.AddScatter(xs, ys);

            scatter.XError = DataGen.Random(rand, 20, .1);
            scatter.YError = DataGen.Random(rand, 20, .1);

            plt.AxisAuto();
            var limits1 = plt.GetAxisLimits();

            //TestTools.SaveFig(plt, "beforeOffset");
            Assert.Less(limits1.XMax, 10);
            Assert.Less(limits1.YMax, 20);

            scatter.OffsetX = 10;
            scatter.OffsetY = 20;

            plt.AxisAuto();
            var limits2 = plt.GetAxisLimits();

            //TestTools.SaveFig(plt, "afterOffset");
            Assert.Greater(limits2.XMax, 10);
            Assert.Greater(limits2.YMax, 20);
        }
Exemple #10
0
        public void Test_Scatter_Smooth()
        {
            double[] xs  = { 18.5, 20.6, 22.3, 24.5, 26.6, 15, 15 };
            double[] ys  = { 1.43, 1.48, 1.6, 1.59, 1.53, 1.52, 1.6 };
            var      plt = new ScottPlot.Plot(600, 400);

            var sp1 = plt.AddScatter(xs, ys, label: "DrawLines()");

            sp1.Smooth = false;

            var sp2 = plt.AddScatter(xs, ys, label: "DrawCurve()");

            sp2.Smooth = true;

            plt.Legend();
            plt.SetAxisLimits(0, 30, 1.42, 1.62);
            TestTools.SaveFig(plt);
        }
Exemple #11
0
        public void Test_Axis_ExtremelySmallNumbers()
        {
            var plt = new ScottPlot.Plot(400, 300);

            plt.Title("Extremely Small (e-20)");
            double[] xs = { 1e-20, 2e-20, 3e-20, 4e-20 };
            double[] ys = { 1e-20, 4e-20, 3e-20, 6e-20 };
            plt.AddScatter(xs, ys);
            TestTools.SaveFig(plt);
        }
Exemple #12
0
        public void Test_Layout()
        {
            int pointCount = 50;

            double[] dataXs  = DataGen.Consecutive(pointCount);
            double[] dataSin = DataGen.Sin(pointCount);
            double[] dataCos = DataGen.Cos(pointCount);

            var plt = new ScottPlot.Plot();

            plt.AddScatter(dataXs, dataSin);
            plt.AddScatter(dataXs, dataCos);

            plt.Title("Very Complicated Data");
            plt.XLabel("Experiment Duration");
            plt.YLabel("Productivity");

            TestTools.SaveFig(plt);
        }
Exemple #13
0
        public void Test_Axis_ModeratelySmallNumbers()
        {
            var plt = new ScottPlot.Plot(400, 300);

            plt.Title("Moderately Small (e-8)");
            double[] xs = { 1e-8, 2e-8, 3e-8, 4e-8 };
            double[] ys = { 1e-8, 4e-8, 3e-8, 6e-8 };
            plt.AddScatter(xs, ys);
            TestTools.SaveFig(plt);
        }
Exemple #14
0
        public void Test_Scatter_AllZeros()
        {
            double[] dataX = { 0, 0, 0, 0, 0 };
            double[] dataY = { 0, 0, 0, 0, 0 };

            var plt = new ScottPlot.Plot(400, 300);

            plt.AddScatter(dataX, dataY);

            TestTools.SaveFig(plt);
        }
Exemple #15
0
        public void Test_Layout_LabelsWithLineBreaks()
        {
            int pointCount = 50;

            double[] dataXs  = DataGen.Consecutive(pointCount);
            double[] dataSin = DataGen.Sin(pointCount);
            double[] dataCos = DataGen.Cos(pointCount);

            var plt = new ScottPlot.Plot();

            plt.AddScatter(dataXs, dataSin);
            plt.AddScatter(dataXs, dataCos);

            string labelWithLineBreak = "Line One\nLine Two";

            plt.XAxis2.Label(label: labelWithLineBreak, size: 30);
            plt.XAxis.Label(labelWithLineBreak);
            plt.YAxis.Label(labelWithLineBreak);

            TestTools.SaveFig(plt);
        }
        public void Test_SMA_DoubleArray()
        {
            Random rand = new Random(0);

            double[] xs     = DataGen.Consecutive(150);
            double[] prices = DataGen.RandomWalk(rand, xs.Length, offset: 50);

            // create SMAs and Xs for each
            double[] sma20   = ScottPlot.Statistics.Finance.SMA(prices, 20);
            double[] sma20xs = xs.Skip(20).ToArray();
            double[] sma50   = ScottPlot.Statistics.Finance.SMA(prices, 50);
            double[] sma50xs = xs.Skip(50).ToArray();

            var plt = new ScottPlot.Plot(600, 400);

            plt.AddScatter(xs, prices, lineWidth: 0, label: "Price");
            plt.AddScatter(sma20xs, sma20, label: "20 day SMA", markerSize: 0, lineWidth: 2);
            plt.AddScatter(sma50xs, sma50, label: "50 day SMA", markerSize: 0, lineWidth: 2);

            plt.YLabel("Price");
            plt.XLabel("Days");
            plt.Legend();
            TestTools.SaveFig(plt);
        }
Exemple #17
0
        public void Test_AutoAxis_ScatterVerticalLine()
        {
            var plt = new ScottPlot.Plot();

            plt.AddScatter(
                xs: new double[] { 1, 1 },
                ys: new double[] { 1, 2 }
                );
            plt.AxisAuto();

            var limits = plt.GetAxisLimits();

            Assert.Greater(limits.XSpan, 0);
            Assert.Greater(limits.YSpan, 0);
        }
Exemple #18
0
        public void Test_Scatter_SinglePoint()
        {
            // https://github.com/ScottPlot/ScottPlot/issues/948
            var plt = new ScottPlot.Plot();

            plt.AddScatter(
                xs: new double[1] {
                0
            },
                ys: new double[1] {
                2
            },
                markerSize: 1,
                lineWidth: 1);
            plt.Render();
        }
Exemple #19
0
        public void Test_DefinedSpacing_DateTimeAxis()
        {
            int pointCount = 20;

            // create a series of dates
            double[] dates    = new double[pointCount];
            var      firstDay = new DateTime(2020, 1, 22);

            for (int i = 0; i < pointCount; i++)
            {
                dates[i] = firstDay.AddDays(i).ToOADate();
            }

            // simulate data for each date
            double[] values = new double[pointCount];
            Random   rand   = new Random(0);

            for (int i = 1; i < pointCount; i++)
            {
                values[i] = values[i - 1] + rand.NextDouble();
            }

            var pltDefault = new ScottPlot.Plot();

            pltDefault.Title("Default xSpacing");
            pltDefault.AddScatter(dates, values);
            pltDefault.XAxis.DateTimeFormat(true);

            var pltTest = new ScottPlot.Plot();

            pltTest.Title("xSpacing = 1 day");
            pltTest.AddScatter(dates, values);
            pltTest.XAxis.DateTimeFormat(true);
            pltTest.XAxis.TickLabelStyle(rotation: 45);
            pltTest.Layout(bottom: 60); // need extra height to accomodate rotated labels

            // force 1 tick per day on a DateTime axis
            pltTest.XAxis.ManualTickSpacing(1, ScottPlot.Ticks.DateTimeUnit.Day);

            //TestTools.SaveFig(pltDefault);
            //TestTools.SaveFig(pltTest);
        }
Exemple #20
0
        public void Test_Scatter_ZoomWorksWithOnePoint()
        {
            // Tests a bug where plots with a single point (axis span 0) can't zoom
            // https://github.com/ScottPlot/ScottPlot/issues/768

            double[] dataX = { 42 };
            double[] dataY = { 303 };

            // create a scatter plot with a single point
            var plt = new ScottPlot.Plot(400, 300);

            plt.AddScatter(dataX, dataY);
            var bmp1 = TestTools.GetLowQualityBitmap(plt);

            // zoom in
            plt.AxisZoom(2, 2);
            var bmp2 = TestTools.GetLowQualityBitmap(plt);

            // ensure the bitmap changed
            Assert.AreNotEqual(ScottPlot.Tools.BitmapHash(bmp1), ScottPlot.Tools.BitmapHash(bmp2));
        }
Exemple #21
0
        public void Test_MultiAxis_AutoAxis()
        {
            double[] xs = { 1, 2, 3 };
            double[] ys = { 4, 5, 6 };

            var plt = new ScottPlot.Plot(400, 300);
            var sp  = plt.AddScatter(xs, ys);

            sp.YAxisIndex = 1;
            sp.XAxisIndex = 1;
            plt.Render();
            var limitsA = plt.GetAxisLimits(1, 1);

            xs[0] = 999;
            ys[0] = 999;
            plt.AxisAuto(0.05, .01, 1, 1);
            plt.Render();
            var limitsB = plt.GetAxisLimits(1, 1);

            Assert.Greater(limitsB.XMax, limitsA.XMax);
            Assert.Greater(limitsB.YMax, limitsA.YMax);
        }
Exemple #22
0
        public void Test_scatter_10kPoints()
        {
            double[]  pointCounts = { 10, 100, 1000, 10000 };
            const int REPS        = 10;

            double[] speeds = new double[pointCounts.Length];

            for (int i = 0; i < pointCounts.Length; i++)
            {
                int      pointCount = (int)pointCounts[i];
                var      plt        = new ScottPlot.Plot();
                Random   rand       = new Random(0);
                double[] xs         = DataGen.Random(rand, pointCount);
                double[] ys         = DataGen.RandomWalk(rand, pointCount);
                plt.AddScatter(xs, ys);
                plt.Render(lowQuality: true);

                List <double> times = new List <double>();
                for (int j = 0; j < REPS; j++)
                {
                    plt.Render(lowQuality: true);
                    times.Add(plt.GetSettings(false).BenchmarkMessage.MSec);
                }

                var stats = new ScottPlot.Statistics.Population(times.ToArray());
                speeds[i] = stats.mean;
                Console.WriteLine($"Rendered {pointCount} points in {stats.mean} ms");
            }

            var plt2 = new ScottPlot.Plot(400, 300);

            plt2.Title("Scatter Plot Benchmark");
            plt2.YLabel("Time (ms)");
            plt2.XLabel("Number of Points");
            plt2.AddScatter(pointCounts, speeds);
            TestTools.SaveFig(plt2);
        }