README.org
March 8, 2022 ยท View on GitHub
- Eazy-Gnuplot [[https://travis-ci.org/guicho271828/eazy-gnuplot.svg]]
Lispy Gnuplot library
- Structure-less -- no CFFI, no CLOS, no STRUCTURE
- Just print the data to the =standard-output= inside =plot= function
News
- [Oct 2015] Supports a single datafile with multiple =:using= options. Plotting made more efficient.
- Supports for Multiplot environment partially available.
- When :terminal is missing, eazy-gnuplot tries to guess its terminal type from the given pathname.
- Growing the list of interfaces available as functions. Still, "unsupported commands" can be directly printed to the stream.
- Fitting function now available.
- Most arguments supports list notation. e.g. not only
:using '(1 2)but also:errors,:via,:size,m?[xyzr]2?(range|tics)... - [Feb 2016] PLOT function accepts strings (treated as functions) and pathnames (treated as datafile). func-plot and datafile-plot are deprecated (but still available).
- [Mar 2022] More arguments support list notation, e.g.,
:first :second :graph :screen :character
** Library Usage
Write 1 =with-plots= and (at least) 1 =gp-setup= per output file. =gp-setup= accepts and sets any attributes -- mighty =&allow-other-keys=. /no compatibility issue re: different gnuplot!/.
For more examples, see the [[http://guicho271828.github.io/eazy-gnuplot/][eazy-gnuplot cookbook]] !
#+BEGIN_SRC lisp ;;; when :debug is non-nil, gnuplot code is copied to trace-output (with-plots (s :debug t) (gp-setup :xlabel "x-label" ; strings : ""x-label"" :ylabel "y-label" :output #p"sample.png" ; pathnames : ""sample.png"" :terminal :png ; keyword/symbols: "terminal png"
;; list contents are recursively quoted, then joined by a space
:key '(:bottom :right :font "Times New Roman, 6")
:pointsize "0.4px"
:yrange :|[0:1]|
;; currently, specifying these kinds of options requires to abuse
;; keywords and symbols. Another example: comma separated list, e.g.,
;; :terminal '(:png :size |10cm,6cm|)
;;
;; 2/4/2016 Major options are now covered.
)
;; any unsupported commands are available by printing it to the stream
(format s "~%unset key")
;; or through gp command
(gp :unset :key)
;; gp-set and gp-unset are equivalent
(gp-unset :key)
;; to force something to be printed verbatim inside a command, use symbols whose names are escaped with || (gp :set :xrange '|[0:1]|)
;; Functions (plot "sin(x)" :title "super sin curve!")
;; Plot data (plot #p"data.csv" :title "super sin curve!")
;; Plot a lisp data directly
(plot (lambda ()
(format s "&0 0")
(format s "&1 1"))
:using '(1 2)
:title "1"
:with '(:linespoint))
(plot (lambda ()
(format s "&0 1")
(format s "&1 0"))
:using '(1 2)
:title "2"
:with '(:lines)))
#+END_SRC
It results in the following png:
[[https://raw.githubusercontent.com/guicho271828/eazy-gnuplot/master/sample.png]]
** From the Command Line
Requirements: Install [[https://github.com/roswell/roswell/wiki/1.-Installation][roswell]].
: PATH+=~/.roswell/bin/ : ros install eazy-gnuplot : plot-init myplot.ros :
** How it works
Above code This produces the following gnuplot code internally. It will then be fed into gnuplot interpreter.
#+BEGIN_SRC gnuplot set xlabel "x-label" set ylabel "y-label" set output "sample.png" set terminal png set key bottom right font "Times New Roman, 6" set pointsize "0.4px" plot sin(x) title "super sin curve!", '-' using 1:2 title "1" with linespoint, '-' using 1:2 title "2" with lines 0 0 1 1 end 0 1 1 0 end #+END_SRC
When the script contains some error and gnuplot finishes with non-zero value, it signals UIOP:SUBPROCESS-ERROR .
- Advanced Usage
** Use the GUI terminals e.g. WXT, QT
You can even try a wxt terminal or qt terminal and see the GUI interactively.
#+BEGIN_SRC lisp
(eazy-gnuplot:with-plots (standard-output :debug t)
(eazy-gnuplot:gp-setup :terminal '(:qt))
(eazy-gnuplot:plot (lambda ()
(format t "~&~A A" 1 2)
(format t "&~A A" 2 5)
(format t "&A %"))
#+END_SRCA" 3 4)))
(format t "&pause mouse button1;
However, these options may not be available on older versions of gnuplot. QT terminal is supported from gnuplot-4.6. WXT terminal has a known bug which leaves a zombie process until gnuplot-4.6.
** Dependencies
This library is at least tested on implementation listed below:
- SBCL 1.2.1 on X86-64 Linux 3.13.0-39-generic (author's environment)
Also, it depends on the following libraries:
-
ITERATE by :: Jonathan Amsterdam's iterator/gatherer/accumulator facility
-
OPTIMA by Tomohiro Matsuyama :: Optimized Pattern Matching Library
-
ALEXANDRIA by :: Alexandria is a collection of portable public domain utilities.
** Author
- Masataro Asai
- Copyright
LLGPL