void Draw() { int width = 400; int height = 400; const int RGBsize = 3; byte[] buffer = new byte[width * height * RGBsize]; for (int i = 0; i < buffer.Length; i++) { buffer[i] = 0xff; } GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned); try { IntPtr pBuf = handle.AddrOfPinnedObject(); using (var pl = new PLStream()) { pl.sdev("mem"); pl.smem(width, height, pBuf); pl.init(); pl.env(0, 10.0, 0, 10.0, 0, 0); pl.join(1.0, 2.0, 7.0, 8.0); } Bitmap bmp = new Bitmap(width, height, 3 * width, PixelFormat.Format24bppRgb, pBuf); this.pictureBox1.Width = width; this.pictureBox1.Height = height; this.pictureBox1.Image = bmp; // bmp.Save("test.bmp"); } finally { handle.Free(); } }
public static void PlotRegressionChart(PlotChartGeneratorModel generationModel) { using (var pl = new PLStream()) { pl.sdev("pngcairo"); pl.sfnam(generationModel.ImageName); // use white background with black foreground pl.spal0("cmap0_alternate.pal"); // Initialize plplot pl.init(); // set axis limits pl.env(generationModel.MinLimitX, generationModel.MaxLimitX, generationModel.MinLimitY, generationModel.MaxLimitY, AxesScale.Independent, AxisBox.CustomXYBoxTicksLabels); // Set scaling for mail title text 125% size of default //pl.schr(0, 1.25); // The main title pl.lab(generationModel.LabelX, generationModel.LabelY, generationModel.Title); // plot using different colors // see http://plplot.sourceforge.net/examples.php?demo=02 for palette indices pl.col0(1); // This code is the symbol to paint char code = (char)9; double yTotal = 0; double xTotal = 0; double xyMultiTotal = 0; double xSquareTotal = 0; var totalNumber = 0; generationModel.PointsList.ForEach(pointsList => { double y0 = 0; double x0 = 0; totalNumber += pointsList.Points.Count(); // plot using other color pl.col0(pointsList.Color); pointsList.Points.ForEach(point => { var x = new double[1]; var y = new double[1]; x[0] = point.X; y[0] = point.Y; if (pointsList.PaintDots) { // Paint a dot pl.poin(x, y, code); } else { if (!generationModel.DrawRegressionLine) { // Draw lines between points pl.join(x0, y0, point.X, point.Y); x0 = point.X; y0 = point.Y; } } xTotal += point.X; yTotal += point.Y; xyMultiTotal += point.X * point.Y; xSquareTotal += point.X * point.X; }); }); // Regression Line calculation explanation: // https://www.khanacademy.org/math/statistics-probability/describing-relationships-quantitative-data/more-on-regression/v/regression-line-example if (generationModel.DrawRegressionLine) { if (generationModel.RegressionPointsList != null) { var xArray = generationModel.RegressionPointsList.Points.Select(dp => dp.X).ToArray(); var yArray = generationModel.RegressionPointsList.Points.Select(dp => dp.Y).ToArray(); pl.col0(generationModel.RegressionPointsList.Color); pl.line(xArray, yArray); } else { double minY = yTotal / totalNumber; double minX = xTotal / totalNumber; double minXY = xyMultiTotal / totalNumber; double minXsquare = xSquareTotal / totalNumber; double m = ((minX * minY) - minXY) / ((minX * minX) - minXsquare); double b = minY - (m * minX); double x1 = generationModel.MinLimitX; //Function for Y1 in the line double y1 = (m * x1) + b; double x2 = generationModel.MaxLimitX; //Function for Y2 in the line double y2 = (m * x2) + b; var xArray = new double[2]; var yArray = new double[2]; xArray[0] = x1; yArray[0] = y1; xArray[1] = x2; yArray[1] = y2; pl.col0(4); pl.line(xArray, yArray); } } if (generationModel.DashedPoint != null) { pl.col0(CommonConstants.PPLplotColorGreen); pl.width(2); // Horizontal Line should go from (0,DashedPoint.Y) to (DashedPoint.X, DashedPoint.Y) DrawDashedLined(pl, 0, generationModel.DashedPoint.Y, generationModel.DashedPoint.X, generationModel.DashedPoint.Y); // Vertical Line should go from (DashedPoint.X,0) to (DashedPoint.X, DashedPoint.Y) DrawDashedLined(pl, generationModel.DashedPoint.X, 0, generationModel.DashedPoint.X, generationModel.DashedPoint.Y); } // end page (writes output to disk) pl.eop(); // output version of PLplot pl.gver(out var verText); } // the pl object is disposed here // Open Chart File In Microsoft Photos App (Or default app, like browser for .svg) Console.WriteLine("Showing chart..."); var p = new Process(); string chartFileNamePath = @".\" + generationModel.ImageName; p.StartInfo = new ProcessStartInfo(chartFileNamePath) { UseShellExecute = true }; p.Start(); }