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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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(); }
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); }
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)); }
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); }
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); }