rhombidodecahedron
rhombidodecahedron

Reputation: 7922

Calling gnuplot from java? (ubuntu)

I'm not sure if this is possible, especially since Java runs through a VM, but can I call gnuplot from within Java? Perhaps I could have Java open a terminal and input

gnuplot
plot ...

etc?

Upvotes: 5

Views: 15071

Answers (5)

Changwang Zhang
Changwang Zhang

Reputation: 2483

Use the JavaGnuplotHybrid library.

It is very light weight (only 3 core classes) and enables hybrid programming with Java and Gnuplot.

  1. Hybrid programming with Java and Gnuplot
  2. Very light weight (just three core Classes)
  3. Use tags in Gnuplot code to execute functions or get fields' values in Java.
  4. Support both synchronized and asynchronized running of Gnuplot in Java. (synchronized: your java program will wait until you close the popped Gnuplot window; asynchronized: you java program will not wait.)
  5. Capture error/normal text output of Gnuplot to the java terminal
  6. Read Gnuplot code from xml files
  7. Support Gnuplot code template.

For more details:

  1. Project page: https://github.com/mleoking/JavaGnuplotHybrid
  2. Examples: https://github.com/mleoking/JavaGnuplotHybrid/blob/master/javagnuplothybrid/doc/examples.md

Upvotes: 1

Yohann Sulaiman
Yohann Sulaiman

Reputation: 11

This works on Debian:

String[] s = {"/usr/bin/gnuplot",
              "-e",
              "set term jpeg large size 800,600;set autoscale; set grid;set format y \"%0.f\";set output \"plot.jpg\";set xdata time;set timefmt \"%Y-%m-%d-%H:%M:%S\";set xlabel \"Dates\";set ylabel \"Data transferred (bytes)\";plot \""+x+"\" using 1:2 title \"Total:"+tot+"\" with linespoints;"
             };
try {
    Runtime rt = Runtime.getRuntime();
    Process proc = rt.exec(s);
    InputStream stdin = proc.getErrorStream();
    InputStreamReader isr = new InputStreamReader(stdin);
    BufferedReader br = new BufferedReader(isr);
    String line = null;
    while ((line = br.readLine()) != null)
        System.err.println("gnuplot:"+line);
    int exitVal = proc.waitFor();
    if (exitVal != 0)
        log("gnuplot Process exitValue: " + exitVal);
    proc.getInputStream().close();
    proc.getOutputStream().close();
    proc.getErrorStream().close();
} catch (Exception e) {
    System.err.println("Fail: " + e);
}

Upvotes: 1

mcandre
mcandre

Reputation: 24612

Use gnujavaplot.

Upvotes: 20

Tansir1
Tansir1

Reputation: 1819

You can launch any external application using the "exec" commands.

http://java.sun.com/javase/6/docs/api/java/lang/Runtime.html

See this page for a few examples. http://www.rgagnon.com/javadetails/java-0014.html

EDIT: I forgot about ProcessBuilder. Michael Borgwardt's answer is a more robust solution.

Upvotes: 0

Michael Borgwardt
Michael Borgwardt

Reputation: 346327

If you can get gnuplot to take all input from the command line or standard input (or read it from a file) and write its output to files as well, then there should be no problem doing this using ProcessBuilder.

Upvotes: 3

Related Questions