# HG changeset patch # User Steve Losh # Date 1552100889 18000 # Node ID dc630773f98afd0dae3547e1f2564dd9bb9d98e7 # Parent 3cf5a5efd686fa5e3cf81fb9c881dbc82324a459 Tweak gnuplot diff -r 3cf5a5efd686 -r dc630773f98a src/gnuplot.lisp --- a/src/gnuplot.lisp Mon Feb 25 22:07:11 2019 -0500 +++ b/src/gnuplot.lisp Fri Mar 08 22:08:09 2019 -0500 @@ -5,7 +5,7 @@ (remove nil args))) (defun gnuplot-args (&key - (output :wxt) + (output :qt) (filename "plot.png") (style :lines) (size-x 1200) @@ -22,6 +22,7 @@ (min-y nil) (max-y nil) (tics-x nil) + (tics-y nil) (graph-title) (logscale-x nil) (logscale-y nil) @@ -33,12 +34,28 @@ the list of possible gnuplot arguments all in one place. " + (check-type axis-x boolean) + (check-type axis-y boolean) + (check-type logscale-x boolean) + (check-type logscale-y boolean) + (check-type line-width (or integer float)) + (check-type box-width (or null integer float)) + (check-type min-x (or null integer float)) + (check-type min-y (or null integer float)) + (check-type max-x (or null integer float)) + (check-type max-y (or null integer float)) + (check-type tics-x (or null integer float)) + (check-type tics-y (or null integer float)) + (check-type graph-title (or null string)) + (check-type label-x (or null string)) + (check-type label-y (or null string)) + (check-type smooth (member nil :unique :frequency :csplines :acsplines :bezier :sbezier)) (flet ((esc (string) (remove #\' (aesthetic-string string))) (f (&rest args) (apply #'format nil (substitute "" nil args)))) (gnuplot-args% (ccase output ((:x :x11) (f "set terminal x11 persist")) - (:qt (f "set terminal qt persist")) + (:qt (f "set terminal qt")) (:wxt (f "set terminal wxt persist")) (:png (f "set terminal pngcairo dashed size ~D,~D font \"Lucida Grande,20\"" @@ -47,8 +64,9 @@ (f "set border linewidth 1") (f "set style line 10 dashtype 2 linewidth 3 linecolor \"#666666\"") (when axis-x (f "set xzeroaxis linestyle 10")) + (when axis-y (f "set yzeroaxis linestyle 10")) (when tics-x (f "set xtics ~A" tics-x)) - (when axis-y (f "set yzeroaxis linestyle 10")) + (when tics-y (f "set ytics ~A" tics-y)) (when box-width (f "set boxwidth ~A" box-width)) (when graph-title (f "set title '~A'" (esc graph-title))) (when label-x (f "set xlabel '~A'" (esc label-x))) @@ -59,12 +77,11 @@ (f "set yrange [~A:~A]" min-y max-y) (f "plot '-' using 1:2 title '~A' with ~(~A~) linewidth ~D ~A" (esc line-title) style line-width - (when smooth (f "smooth ~(~A~)" smooth)))))) + (when smooth (f "smooth ~(~A~)" smooth))) + (f "pause mouse close")))) -(defun gnuplot (data - &rest args - &key +(defun gnuplot (data &rest args &key (x #'car) (y #'cdr) (spew-output nil) @@ -83,16 +100,14 @@ See the docstring of `gnuplot-args` for other keyword arguments. " - (uiop/package:symbol-call :ql :quickload 'external-program :silent t) - (let* ((process (uiop/package:symbol-call - :external-program :start - "gnuplot" - (apply #'gnuplot-args args) - :input :stream - :output (if spew-output *standard-output* nil))) - (in (uiop/package:symbol-call - :external-program :process-input-stream - process))) + (funcall (read-from-string "ql:quickload") 'external-program :silent t) + (let* ((process (funcall (read-from-string "external-program:start") + "gnuplot" + (apply #'gnuplot-args args) + :input :stream + :output (if spew-output *standard-output* nil))) + (in (funcall (read-from-string "external-program:process-input-stream") + process))) (unwind-protect (progn (iterate (for item :in-whatever data) @@ -101,15 +116,13 @@ (close in)) process)) -(defun gnuplot-function (function - &rest args - &key +(defun gnuplot-function (function &rest args &key (start 0.0) (end 1.0) (step 0.1) (include-end nil) &allow-other-keys) - "Plot `function` over [`start`, `end`) by `step` with gnuplot. + "Plot `function` over `[start, end)` by `step` with gnuplot. If `include-end` is `t` the `end` value will also be plotted. @@ -126,9 +139,8 @@ (apply #'gnuplot data args))) -(defun gnuplot-histogram (data - &rest args - &key (bin-width 1) +(defun gnuplot-histogram (data &rest args &key + (bin-width 1) &allow-other-keys) "Plot `data` as a histogram with gnuplot.