From 65e6b7e04d7529625443d1b9b4a66d1b55f87d98 Mon Sep 17 00:00:00 2001 From: Scott W Harden Date: Sat, 27 Jul 2019 10:29:12 -0400 Subject: [PATCH] update cookbook --- .gitignore | 2 + demos/ScottPlotCookbook/COPY-COOKBOOK.bat | 6 +- demos/ScottPlotCookbook/CookBookManager.cs | 4 +- doc/cookbook/README.md | 141 ++++++++++++++++++++- 4 files changed, 149 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 47054b8213..f85c0c4276 100644 --- a/.gitignore +++ b/.gitignore @@ -292,3 +292,5 @@ doc/cookbook/images/30_Signal.png doc/cookbook/images/31_Signal_With_Antialiasing_Off.png doc/cookbook/images/31_Signal_With_Antialiasing_Off.png doc/cookbook/images/30_Signal.png +doc/cookbook/images/30_Signal.png +doc/cookbook/images/31_Signal_With_Antialiasing_Off.png diff --git a/demos/ScottPlotCookbook/COPY-COOKBOOK.bat b/demos/ScottPlotCookbook/COPY-COOKBOOK.bat index bd6f2c7d5f..55d5935ec1 100644 --- a/demos/ScottPlotCookbook/COPY-COOKBOOK.bat +++ b/demos/ScottPlotCookbook/COPY-COOKBOOK.bat @@ -1,5 +1,9 @@ +:: clear the old cookbook del /q ..\..\doc\cookbook\images\*.* -copy .\bin\Debug\images\*.* ..\..\doc\cookbook\images\*.* del /q ..\..\doc\cookbook\README.md + +:: copy the new cookbook +copy .\bin\Debug\images\*.* ..\..\doc\cookbook\images\*.* copy .\bin\Debug\README.md ..\..\doc\cookbook\README.md + pause \ No newline at end of file diff --git a/demos/ScottPlotCookbook/CookBookManager.cs b/demos/ScottPlotCookbook/CookBookManager.cs index c2f7b8b9c7..b312217528 100644 --- a/demos/ScottPlotCookbook/CookBookManager.cs +++ b/demos/ScottPlotCookbook/CookBookManager.cs @@ -80,6 +80,8 @@ public void GenerateAllFigures(int width, int height, string outputFolderName = ValidateImageHashes(hashes.ToArray()); + GenerateReport(outputFolderName); + Console.WriteLine("\nCOOKBOOK GENERATION COMPLETE"); Console.WriteLine("\nOptionally update the cookbook with:"); string cookBookCopierPath = System.IO.Path.GetFullPath("../../"); @@ -117,7 +119,7 @@ public string ReadCodeFromFile(string functionName, string fileName = "Recipes.c // isolate the function functionName = "Figure_" + functionName; - int posStart = code.IndexOf($"public void {functionName}()"); + int posStart = code.IndexOf($"public string {functionName}()"); if (posStart < 0) { string message = $"function {functionName}() not found in {sourceFilePath}"; diff --git a/doc/cookbook/README.md b/doc/cookbook/README.md index 51f29a833f..b9ad5c05be 100644 --- a/doc/cookbook/README.md +++ b/doc/cookbook/README.md @@ -10,7 +10,7 @@ plt.PlotScatter(dataXs, dataSin); plt.PlotScatter(dataXs, dataCos); plt.SaveFig(fileName); -string hash = ScottPlot.Tools.BitmapHash(plt.GetBitmap()); +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/01a_Scatter_Sin.png) @@ -23,6 +23,8 @@ plt.PlotScatter(dataXs, dataSin); plt.PlotScatter(dataXs, dataCos); plt.AxisAuto(0, .5); // no horizontal padding, 50% vertical padding plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/01b_Automatic_Margins.png) @@ -35,6 +37,8 @@ plt.PlotScatter(dataXs, dataSin); plt.PlotScatter(dataXs, dataCos); plt.Axis(2, 8, .2, 1.1); // x1, x2, y1, y2 plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/01c_Defined_Axis_Limits.png) @@ -48,6 +52,8 @@ plt.PlotScatter(dataXs, dataCos); plt.AxisZoom(2, 2); plt.AxisPan(-10, .5); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/01d_Zoom_and_Pan.png) @@ -58,12 +64,28 @@ plt.SaveFig(fileName); var plt = new ScottPlot.Plot(600, 400); plt.PlotScatter(dataXs, dataSin, label: "first"); plt.PlotScatter(dataXs, dataCos, label: "second"); -plt.Legend(); +plt.Legend(location: ScottPlot.legendLocation.lowerLeft); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/01e_Legend.png) +## Custom Marker Shapes + +```cs +var plt = new ScottPlot.Plot(600, 400); +plt.PlotScatter(dataXs, dataSin, label: "sin", markerShape: ScottPlot.MarkerShape.openCircle); +plt.PlotScatter(dataXs, dataCos, label: "cos", markerShape: ScottPlot.MarkerShape.filledSquare); +plt.Legend(); +plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); +``` + +![](./images/01f_Custom_Marker_Shapes.png) + ## Styling Scatter Plots ```cs @@ -72,6 +94,8 @@ plt.PlotScatter(dataXs, dataSin, color: Color.Magenta, lineWidth: 0, markerSize: plt.PlotScatter(dataXs, dataCos, color: Color.Green, lineWidth: 5, markerSize: 0); plt.AxisAuto(0); // no horizontal margin (default 10% vertical margin) plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/02_Styling_Scatter_Plots.png) @@ -82,6 +106,8 @@ plt.SaveFig(fileName); var plt = new ScottPlot.Plot(600, 400); plt.PlotScatter(dataRandom1, dataRandom2); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/03_Plot_XY_Data.png) @@ -93,6 +119,8 @@ var plt = new ScottPlot.Plot(600, 400); plt.PlotScatter(dataRandom1, dataRandom2, markerSize: 0); plt.PlotScatter(dataRandom3, dataRandom4, markerSize: 0); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/04_Plot_Lines_Only.png) @@ -104,6 +132,8 @@ var plt = new ScottPlot.Plot(600, 400); plt.PlotScatter(dataRandom1, dataRandom2, lineWidth: 0); plt.PlotScatter(dataRandom3, dataRandom4, lineWidth: 0); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/05_Plot_Points_Only.png) @@ -115,6 +145,8 @@ var plt = new ScottPlot.Plot(600, 400); plt.PlotScatter(dataRandom1, dataRandom2, color: Color.Magenta, lineWidth: 3, markerSize: 15); plt.PlotScatter(dataRandom3, dataRandom4, color: Color.Green, lineWidth: 3, markerSize: 15); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/06_Styling_XY_Plots.png) @@ -128,6 +160,8 @@ plt.PlotScatter(dataXs, dataCos); plt.PlotPoint(25, 0.8); plt.PlotPoint(30, 0.3, color: Color.Magenta, markerSize: 15); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/07_Plotting_Points.png) @@ -143,6 +177,8 @@ plt.PlotPoint(30, 0.3, color: Color.Magenta, markerSize: 15); plt.PlotText("important point", 25, 0.8); plt.PlotText("more important", 30, .3, fontSize: 16, bold: true); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/08_Plotting_Text.png) @@ -156,6 +192,8 @@ plt.PlotScatter(dataXs, dataCos); plt.Clear(); plt.PlotScatter(dataRandom3, dataRandom4); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/09_Clearing_Plots.png) @@ -177,6 +215,9 @@ for (int i = 10; i < 20; i++) } plt.SaveFig(fileName); + +PrepareDataSmall(); // hide +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/10_Modifying_Plotted_Data.png) @@ -188,6 +229,8 @@ var plt = new ScottPlot.Plot(200, 150); plt.PlotScatter(dataXs, dataSin); plt.PlotScatter(dataXs, dataCos); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/20_Small_Plot.png) @@ -204,6 +247,8 @@ plt.XLabel("Experiment Duration"); plt.YLabel("Productivity"); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/21a_Title_and_Axis_Labels.png) @@ -222,6 +267,8 @@ plt.YLabel("Productivity"); plt.TightenLayout(padding: 40); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/21b_Extra_Padding.png) @@ -242,6 +289,8 @@ plt.Title("Very Complicated Data", Color.White); plt.XLabel("Experiment Duration", Color.LightGray); plt.YLabel("Productivity", Color.LightGray); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/22_Custom_Colors.png) @@ -260,6 +309,8 @@ plt.PlotScatter(dataXs, dataSin); plt.PlotScatter(dataXs, dataCos); plt.TightenLayout(padding: 0); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/23_Frameless_Plot.png) @@ -272,6 +323,8 @@ plt.PlotScatter(dataXs, dataSin); plt.PlotScatter(dataXs, dataCos); plt.Grid(false); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/24_Disable_the_Grid.png) @@ -285,6 +338,8 @@ plt.PlotScatter(dataXs, dataCos); plt.Grid(false); plt.Frame(right: false, top: false); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/25_Corner_Axis_Frame.png) @@ -299,6 +354,8 @@ plt.Grid(false); plt.Ticks(displayTicksY: false); plt.Frame(left: false, right: false, top: false); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/26_Horizontal_Ticks_Only.png) @@ -312,6 +369,8 @@ var plt = new ScottPlot.Plot(600, 400); plt.Benchmark(); plt.PlotSignal(dataSignal, sampleRate: 20_000); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/30_Signal.png) @@ -325,6 +384,8 @@ plt.Benchmark(); plt.AntiAlias(true, false); plt.PlotSignal(dataSignal, sampleRate: 20_000); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/31_Signal_With_Antialiasing_Off.png) @@ -335,6 +396,8 @@ plt.SaveFig(fileName); var plt = new ScottPlot.Plot(600, 400); plt.PlotSignal(dataSignal, 20000, lineWidth: 3, color: Color.Red); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/32_Signal_Styling.png) @@ -348,6 +411,8 @@ plt.PlotScatter(dataXs, dataCos); plt.PlotVLine(17); plt.PlotHLine(-.25, color: Color.Red, lineWidth: 3); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/40_Vertical_and_Horizontal_Lines.png) @@ -364,6 +429,8 @@ plt.YLabel("Productivity"); plt.Legend(); plt.Style(ScottPlot.Style.Blue1); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/50_StyleBlue1.png) @@ -380,6 +447,8 @@ plt.YLabel("Productivity"); plt.Legend(); plt.Style(ScottPlot.Style.Blue2); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/51_StyleBlue2.png) @@ -396,6 +465,8 @@ plt.YLabel("Productivity"); plt.Legend(); plt.Style(ScottPlot.Style.Blue3); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/52_StyleBlue3.png) @@ -412,6 +483,8 @@ plt.YLabel("Productivity"); plt.Legend(); plt.Style(ScottPlot.Style.Light1); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/53_StyleLight1.png) @@ -428,6 +501,8 @@ plt.YLabel("Productivity"); plt.Legend(); plt.Style(ScottPlot.Style.Light2); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/54_StyleLight2.png) @@ -444,6 +519,8 @@ plt.YLabel("Productivity"); plt.Legend(); plt.Style(ScottPlot.Style.Gray1); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/55_StyleGray1.png) @@ -460,6 +537,8 @@ plt.YLabel("Productivity"); plt.Legend(); plt.Style(ScottPlot.Style.Gray2); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/56_StyleGray2.png) @@ -476,6 +555,8 @@ plt.YLabel("Productivity"); plt.Legend(); plt.Style(ScottPlot.Style.Black); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/57_StyleBlack.png) @@ -492,6 +573,8 @@ plt.YLabel("Productivity"); plt.Legend(); plt.Style(ScottPlot.Style.Default); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/58_StyleDefault.png) @@ -508,6 +591,8 @@ plt.YLabel("Productivity"); plt.Legend(); plt.Style(ScottPlot.Style.Control); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/59_StyleControl.png) @@ -550,6 +635,8 @@ for (int plotNumber = 0; plotNumber < 3; plotNumber++) plt.Title("Scatter Plot with Errorbars"); plt.Legend(); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/60_Plotting_With_Errorbars.png) @@ -566,6 +653,8 @@ var plt = new ScottPlot.Plot(600, 400); plt.Title("Bar Plot With Error Bars"); plt.PlotBar(dataXs, dataSin, barWidth: .5, errorY: yErr, errorCapSize: 2); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/61_Plot_Bar_Data.png) @@ -600,6 +689,8 @@ plt.PlotBar(Xs, dataB, errorY: errorB, label: "data B", barWidth: 3.2, xOffset: plt.Axis(null, null, 0, null); plt.Legend(); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/62_Plot_Bar_Data_Fancy.png) @@ -611,6 +702,8 @@ var plt = new ScottPlot.Plot(600, 400); plt.PlotStep(dataXs, dataSin); plt.PlotStep(dataXs, dataCos); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/63_Step_Plot.png) @@ -623,6 +716,8 @@ plt.PlotScatter(dataXs, dataSin); plt.PlotScatter(dataXs, dataCos); plt.Grid(xSpacing: 2, ySpacing: .1); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/64_Manual_Grid_Spacing.png) @@ -641,6 +736,8 @@ plt.XLabel("Value (units)"); plt.PlotBar(hist1.bins, hist1.counts, barWidth: 1); plt.Axis(null, null, 0, null); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/65_Histogram.png) @@ -663,7 +760,47 @@ plt.PlotStep(hist2.bins, hist2.cumulativeFrac, lineWidth: 1.5, label: "sample B" plt.Legend(); plt.Axis(null, null, 0, 1); plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); ``` ![](./images/66_CPH.png) +## Candlestick + +```cs +Random rand = new Random(0); +int pointCount = 60; +ScottPlot.OHLC[] ohlcs = ScottPlot.DataGen.RandomStockPrices(rand, pointCount); + +var plt = new ScottPlot.Plot(600, 400); +plt.Title("Candlestick Chart"); +plt.YLabel("Stock Price (USD)"); +plt.XLabel("Day (into Q4)"); +plt.PlotCandlestick(ohlcs); +plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); +``` + +![](./images/67_Candlestick.png) + +## OHLC + +```cs +Random rand = new Random(0); +int pointCount = 60; +ScottPlot.OHLC[] ohlcs = ScottPlot.DataGen.RandomStockPrices(rand, pointCount); + +var plt = new ScottPlot.Plot(600, 400); +plt.Title("Open/High/Low/Close (OHLC) Chart"); +plt.YLabel("Stock Price (USD)"); +plt.XLabel("Day (into Q4)"); +plt.PlotOHLC(ohlcs); +plt.SaveFig(fileName); + +return name + ":" + ScottPlot.Tools.BitmapHash(plt.GetBitmap()); +``` + +![](./images/68_OHLC.png) +