forked from mirrors/org-mode
org-plot.el: abstract plot types into custom var
* lisp/org-plot.el (org-plot/preset-plot-types): New option to declare plot types and provide a lambda which is called with a fixed signature to generate associated gnuplot code. The previously hardcoded types are implemented as the default value. (org-plot/gnuplot-script): Abstract the generation of gnuplot commands from the three hardcoded types: 2d, 3d, and grid.
This commit is contained in:
parent
a1d92bd918
commit
bee7ef6f46
|
@ -189,6 +189,49 @@ other content generated in `org-plot/gnuplot-script'."
|
||||||
:group 'org-plot
|
:group 'org-plot
|
||||||
:type '(choice string function))
|
:type '(choice string function))
|
||||||
|
|
||||||
|
(defcustom org-plot/preset-plot-types
|
||||||
|
'((2d (lambda (data-file num-cols params plot-str)
|
||||||
|
(let* ((type (plist-get params :plot-type))
|
||||||
|
(with (if (eq type 'grid) 'pm3d (plist-get params :with)))
|
||||||
|
(ind (plist-get params :ind))
|
||||||
|
(deps (if (plist-member params :deps) (plist-get params :deps)))
|
||||||
|
(text-ind (plist-get params :textind))
|
||||||
|
(col-labels (plist-get params :labels))
|
||||||
|
res)
|
||||||
|
(dotimes (col num-cols res)
|
||||||
|
(unless (and (eq type '2d)
|
||||||
|
(or (and ind (equal (1+ col) ind))
|
||||||
|
(and deps (not (member (1+ col) deps)))))
|
||||||
|
(setf res
|
||||||
|
(cons
|
||||||
|
(format plot-str data-file
|
||||||
|
(or (and ind (> ind 0)
|
||||||
|
(not text-ind)
|
||||||
|
(format "%d:" ind)) "")
|
||||||
|
(1+ col)
|
||||||
|
(if text-ind (format ":xticlabel(%d)" ind) "")
|
||||||
|
with
|
||||||
|
(or (nth col col-labels)
|
||||||
|
(format "%d" (1+ col))))
|
||||||
|
res)))))))
|
||||||
|
(3d (lambda (data-file num-cols params plot-str)
|
||||||
|
(let* ((type (plist-get params :plot-type))
|
||||||
|
(with (if (eq type 'grid) 'pm3d (plist-get params :with))))
|
||||||
|
(list (format "'%s' matrix with %s title ''"
|
||||||
|
data-file with)))))
|
||||||
|
(grid (lambda (data-file num-cols params plot-str)
|
||||||
|
(let* ((type (plist-get params :plot-type))
|
||||||
|
(with (if (eq type 'grid) 'pm3d (plist-get params :with))))
|
||||||
|
(list (format "'%s' with %s title ''"
|
||||||
|
data-file with))))))
|
||||||
|
"List of plot presets with the type name as the car, and a function
|
||||||
|
which yeilds plot-lines (a list of strings) as the cdr.
|
||||||
|
The parameters of `org-plot/gnuplot-script' and PLOT-STR are passed to
|
||||||
|
that function. i.e. it is called with the following arguments:
|
||||||
|
DATA-FILE NUM-COLS PARAMS PLOT-STR"
|
||||||
|
:group 'org-plot
|
||||||
|
:type '(alist :value-type (symbol group)))
|
||||||
|
|
||||||
(defun org-plot/gnuplot-script (data-file num-cols params &optional preface)
|
(defun org-plot/gnuplot-script (data-file num-cols params &optional preface)
|
||||||
"Write a gnuplot script to DATA-FILE respecting the options set in PARAMS.
|
"Write a gnuplot script to DATA-FILE respecting the options set in PARAMS.
|
||||||
NUM-COLS controls the number of columns plotted in a 2-d plot.
|
NUM-COLS controls the number of columns plotted in a 2-d plot.
|
||||||
|
@ -255,29 +298,11 @@ manner suitable for prepending to a user-specified script."
|
||||||
(or timefmt ; timefmt passed to gnuplot
|
(or timefmt ; timefmt passed to gnuplot
|
||||||
"%Y-%m-%d-%H:%M:%S") "\"")))
|
"%Y-%m-%d-%H:%M:%S") "\"")))
|
||||||
(unless preface
|
(unless preface
|
||||||
(pcase type ; plot command
|
(let ((type-func (cadr (assoc type org-plot/preset-plot-types))))
|
||||||
(`2d (dotimes (col num-cols)
|
(when type-func
|
||||||
(unless (and (eq type '2d)
|
(setq plot-lines
|
||||||
(or (and ind (equal (1+ col) ind))
|
(funcall type-func data-file num-cols params plot-str))))
|
||||||
(and deps (not (member (1+ col) deps)))))
|
|
||||||
(setf plot-lines
|
|
||||||
(cons
|
|
||||||
(format plot-str data-file
|
|
||||||
(or (and ind (> ind 0)
|
|
||||||
(not text-ind)
|
|
||||||
(format "%d:" ind)) "")
|
|
||||||
(1+ col)
|
|
||||||
(if text-ind (format ":xticlabel(%d)" ind) "")
|
|
||||||
with
|
|
||||||
(or (nth col col-labels)
|
|
||||||
(format "%d" (1+ col))))
|
|
||||||
plot-lines)))))
|
|
||||||
(`3d
|
|
||||||
(setq plot-lines (list (format "'%s' matrix with %s title ''"
|
|
||||||
data-file with))))
|
|
||||||
(`grid
|
|
||||||
(setq plot-lines (list (format "'%s' with %s title ''"
|
|
||||||
data-file with)))))
|
|
||||||
(funcall ats
|
(funcall ats
|
||||||
(concat plot-cmd " " (mapconcat #'identity
|
(concat plot-cmd " " (mapconcat #'identity
|
||||||
(reverse plot-lines)
|
(reverse plot-lines)
|
||||||
|
|
Loading…
Reference in a new issue