/eazy-gnuplot

Fork of Super Duper Doopa Booka Lispy Gnuplot library

Primary LanguageCommon Lisp

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 eazy-gnuplot cookbook !

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

It results in the following png:

https://raw.githubusercontent.com/guicho271828/eazy-gnuplot/master/sample.png

From the Command Line

Requirements: Install 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.

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

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.

(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 ~A" 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