emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [O] using gnuplot's "splot" and "every" commands on org-mode table d


From: Eric Schulte
Subject: Re: [O] using gnuplot's "splot" and "every" commands on org-mode table data
Date: Fri, 03 May 2013 10:09:01 -0600
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux)

Paul Stansell <address@hidden> writes:

> Hello everyone,
>
> I'd be grateful if someone would offer me advice on using gnuplot's
> "splot" and "every" commands when plotting data from a table within
> org-mode.
>
> As far as I can tell, these gnuplot commands do not work properly
> because org-mode exports empty fields in tables as "" and gnuplot's
> "every" and splot commands expect the data file to be formatted as a
> datablock with blank lines marking the boundaries between datablocks.
> (For the definition of a datablock, type "help glossary" at the
> gnuplot prompt.)
>
> I'm using org-mode version 8.0.2 and emacs version 24.2.1 on a
> Fedora-18 system
>
>
> To illustrate my point, consider a blocked datafile called "block.dat"
> containing the following:
>
>   1       1       2
>   1       2       5
>   1       3       10
>
>   2       1       5
>   2       2       8
>   2       3       13
>
>   3       1       10
>   3       2       13
>   3       3       18
>
> For this file the gnuplot command
>
>    #+begin_src gnuplot :var d="block.dat" :results silent
>      plot "$d" u 2:3 ev :::0::0, "" u 2:3 ev :::1::1, "" u 2:3 ev :::2::2
>    #+end_src
>
> shows three separate lines of different colours as gnuplot
> recognises the datafile as blocked data.
>
> Also, the following command produces a surface plot
>
>    #+begin_src gnuplot :var d="block.dat" :results silent
>      splot "$d" u 1:2:3
>    #+end_src
>
> However, if I put the same data in the table below
>
>    #+tblname: data
>    | 1 | 1 |  2 |
>    | 1 | 2 |  5 |
>    | 1 | 3 | 10 |
>    |   |   |    |
>    | 2 | 1 |  5 |
>    | 2 | 2 |  8 |
>    | 2 | 3 | 13 |
>    |   |   |    |
>    | 3 | 1 | 10 |
>    | 3 | 2 | 13 |
>    | 3 | 3 | 18 |
>
> and use the following plot command
>
>    #+begin_src gnuplot :var d=data :results silent
>      plot "$d" u 2:3 ev :::0::0, "" u 2:3 ev :::1::1, "" u 2:3 ev :::2::2
>    #+end_src
>
> the result is a plot of a single line of the same colour as gnuplot
> joins all of the points in the data file.  This seems to be because
> org-mode exports the table as
>
>   "x"     "y"     "z"
>   1       1       2
>   1       2       5
>   1       3       10
>   ""      ""      ""
>   2       1       5
>   2       2       8
>   2       3       13
>   ""      ""      ""
>   3       1       10
>   3       2       13
>   3       3       18
>
> and gnuplot does not recognise this as a blocked data file because it
> contains no blank lines.
>
> The same problem occurs for
>
>    #+begin_src gnuplot :var d=data :results silent
>      splot "$d" u 1:2:3
>    #+end_src
>
> which does not produce a gridded surface plot.
>
> Thanks for your help,
>

Hi Paul,

While I can't claim to fully follow your gnuplot examples, i would
recommend using an intervening shell code block to parse the Org-mode
table data into something that gnuplot will ingest.

If I understand your use case correctly, then something like the
following should work.

#+name: data
| 1 | 1 |  2 |
| 1 | 2 |  5 |
| 1 | 3 | 10 |
|   |   |    |
| 2 | 1 |  5 |
| 2 | 2 |  8 |
| 2 | 3 | 13 |
|   |   |    |
| 3 | 1 | 10 |
| 3 | 2 | 13 |
| 3 | 3 | 18 |

#+name: clean
#+begin_src sh :var data=data :results file :file /tmp/data.gnuplot
  echo "$data" > /tmp/data.gnuplot
#+end_src

#+begin_src gnuplot :var data=clean(data) :results silent
  splot "$data" u 1:2:3
#+end_src
If you really wanted to be fancy, gnuplot will let you specify shell
transformations as part of the plotting command which would allow you to
forego the intermediate code block.

-- 
Eric Schulte
http://cs.unm.edu/~eschulte

reply via email to

[Prev in Thread] Current Thread [Next in Thread]