This is the mail archive of the guile@cygnus.com mailing list for the guile project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
G'day all,
> > Supplementary issues: When transferring data to and from octave, what
> > structure is passed? What about plotting with gnuplot as one can in
> > Octave?
>
> Dunno about octave. Gnuplot will handle files that are just columns
> of numbers. For 3d plotting the samples must be on a regular grid and
> the file has blank lines to group the rows. It is a very easy format
> to generate in any language so the value of writing special-purpose
> export routines seems small.
Here's the tiniest of hacks which I have been using for a while to
plot 2D data from guile with gnuplot. No "fancy" features like: axis
labels, plot labels, etc.
I've also been fiddling (in my not-so-copious spare time) with an
object style interface to datasets and plots. Maybe one day...
(Actually, I'd also like multiple backends for this interface: GNU
plotutils, gnuplot, charplot, ....).
cheers,
glenn.
Install it as gnuplot/plot.scm somewhere in your %load-path.
;;;; Copyright (C) 1997 Glenn Moloney
;;;;
;;;; This program is free software; you can redistribute it and/or modify
;;;; it under the terms of the GNU General Public License as published by
;;;; the Free Software Foundation; either version 2, or (at your option)
;;;; any later version.
;;;;
;;;; This program is distributed in the hope that it will be useful,
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;;;; GNU General Public License for more details.
;;;;
;;;; You should have received a copy of the GNU General Public License
;;;; along with this software; see the file COPYING. If not, write to
;;;; the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
;;;; Boston, MA 02111-1307 USA
;;;;
;; Description:
;;
;; Provides a simple scheme interface for plotting data via gnuplot
;; Usage:
;; Single data sets:
;; (gnuplot-plot . args)
;; Plot several data sets on one graph:
;; (gnuplot-multiplot . args)
;; Plot a list data points:
;; (gnuplot-plot-points . args)
;; Pass arbitrary commands to gnuplot:
;; (gnuplot . args)
;;
;; Examples:
;; Single Curves:
;; (gnuplot-plot 0 1 2 3) ; Plot the given Y values
;; (gnuplot-plot #(0 1 2 3))
;; (gnuplot-plot '(0 1 2 3))
;; (gnuplot-plot #(0 1 2 3) #(0 1 2 3)) ; Plot the given X and Y values
;; (gnuplot-plot '(0 1 2 3) '(0 1 2 3))
;; Multiple Curves:
;; (gnuplot-multiplot #(0 1 2 3) #(0 2 4 6)) ; Two data sets
;; (gnuplot-multiplot '(0 1 2 3) '(0 2 4 6)) ; Two data sets
;; (gnuplot-multiplot '((0 1 2 3)(0 1 2 3))
;; '((0 1 2 3)(0 2 4 6)))
;; (gnuplot-multiplot '(#(0 1 2 3)#(0 1 2 3))
;; '(#(0 1 2 3)#(0 2 4 6)))
;; Lists of points:
;; (gnuplot-plot-points '((1 . 1)(2 . 4)(3 . 9)(4 . 16)(5 . 25)))
;; (gnuplot-plot-points '((1 1)(2 4)(3 9)(4 16)(5 25))
;; '((1 1)(2 2)(3 3)(4 4)))
;; Set the X axis label:
;; (gnuplot "set xlabel 'X axis'")
(define-module (gnuplot plot))
(define gnuplot-port #f)
(define-public gnuplot-line-style "linespoints")
(define (gnuplot-open)
(set! gnuplot-port (open-output-pipe "gnuplot")))
(define-public (gnuplot . cmd)
(if (not gnuplot-port)
(gnuplot-open))
(for-each (lambda (arg) (display arg gnuplot-port))
cmd)
(newline gnuplot-port)
(force-output gnuplot-port))
(define-public (gnuplot-enddata)
(display "e" gnuplot-port)
(newline gnuplot-port))
(define-public (gnuplot-endplot)
(force-output gnuplot-port))
(define-public (gnuplot-close)
(if gnuplot-port
(begin
(gnuplot-endplot)
(gnuplot "quit")
(close-output-port gnuplot-port)
(set! gnuplot-port #f))))
(define-public (gnuplot-newplot n)
(if (not gnuplot-port)
(gnuplot-open))
(gnuplot "set data style " gnuplot-line-style)
(apply gnuplot
"plot '-'"
(make-list (1- n) ", '-'")))
(define-public (gnuplot-plot-point . point)
(for-each (lambda (arg)
(display arg gnuplot-port)
(display " " gnuplot-port))
point)
(newline gnuplot-port))
(define (gnuplot-plot-dataset data)
(cond ((vector? data) ; #(1 2 3 4)
(array-for-each gnuplot-plot-point data))
((and (list? data) ; '(#(1 2 3 4) #(10 20 30 40))
(vector? (car data)))
(apply array-for-each gnuplot-plot-point data))
((and (list? data) ; '(1 2 3 4)
(number? (car data)))
(for-each gnuplot-plot-point data))
((and (list? data) ; '((1 2 3 4)(10 20 30 40))
(list? (car data))
(number? (caar data)))
(apply for-each gnuplot-plot-point data)))
(gnuplot-enddata))
(define (gnuplot-plot-pointset data)
(cond ((and (list? data) ; '((1 1)(2 4)(3 9))
(list? (car data))
(number? (caar data)))
(for-each (lambda (arg) (apply gnuplot-plot-point arg))
data))
((and (list? data) ; '((1 . 1)(2 . 4)(3 . 9))
(pair? (car data))
(number? (caar data)))
(for-each (lambda (arg) (gnuplot-plot-point (car arg) (cdr arg)))
data))
(#t
(display "Invalid data set")))
(gnuplot-enddata))
(define-public (gnuplot-multiplot . data)
(gnuplot-newplot (length data))
(for-each gnuplot-plot-dataset data)
(gnuplot-endplot))
(define-public (gnuplot-plot . data)
(gnuplot-multiplot data))
(define-public (gnuplot-plot-points . data)
(gnuplot-newplot (length data))
(for-each gnuplot-plot-pointset data)
(gnuplot-endplot))