JavaとGnuplot: グラフのプロットを行う方法

このQ&Aのポイント
  • JavaからGnuplotを利用してグラフのプロットを行いたいが、うまくいかない。
  • JavaでGnuplotを起動し、グラフのプロットを行いたいが、プロットの命令が伝わらない。
  • JavaとGnuplotを連携してグラフを描画する方法がうまくいかない。
回答を見る
  • ベストアンサー

JAVAとGnuplot

javaからGnuplotを起動させ、グラフのプロットを行いたいのですがうまくいきません。 ソースは String gnuplot_cmd = "plot sin(x)" ; try { p = Runtime.getRuntime().exec("C:~省略~\\wgnuplot.exe"); } catch (IOException e) { e.printStackTrace(); } pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(p.getOutputStream()))); pw.print(gnuplot_cmd); pw.close(); です。 起動はするのですが、プロットの命令がうまく伝わりません。 よろしくお願いします。

  • Java
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

pw.close()を実行した時点でgnuplotは終了します。 gnuplotのプロット先が画像ファイルならばそれで問題ないでしょうが、画面に描画する場合にはgnuplotが終了するとグラフのウィンドウがすぐ消えてしまうと思います。 グラフのウィンドウをしばらく眺めていたい場合には、pw.close()を実行する前に時間稼ぎをする必要があります。ごく手抜きな方法としては、Thread.sleep()を使うとか。 あと、念のためpw.println()の後にpw.flush()を入れておくといいかも。

mmmmmmkn
質問者

お礼

ありがとうございます。 pw.flush()とThread.sleep()を入れて、しっかりと起動&グラフの描写ができました。 本当に助かりました。 あと、もうひとつ原因があって、「wgnuplot」ではなく、 パイプ用の「pgnuplot」を使うべきだったようです。 ありがとうございました。

その他の回答 (1)

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

Windowsでは試していませんが、 pw.print(gnuplot_cmd);のところはpw.println(gnuplot_cmd);とすべきではないでしょうか。 また、gnuplotのプロセスがすぐに終了してしまわないように工夫する必要があると思います。

mmmmmmkn
質問者

お礼

回答ありがとうございます! 確かに[println]でないとダメでした。 ご指摘ありがとうございます。 >>gnuplotのプロセスがすぐに終了してしまわないように工夫する必要がある とは具体的にどのようなことが考えられるんでしょうか? たびたびすみません。

関連するQ&A

  • Java・ファイルへの書き込み

    はじめまして。 下記のプログラムで、以下の3つがどのような関係なのかがわかりません。 ("test1.txt")とnew FileWriterの関係 (new FileWriter("test1.txt")とnew BufferedWriterの関係 (new BufferedWriter(new FileWriter("test1.txt")と new PrintWriterの関係 どうかご教示いただきたく、よろしくお願い致します。 import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; public class Sample7 { public static void main(String[] args){ PrintWriter pw = null; try{ pw = new PrintWriter (new BufferedWriter(new FileWriter("test1.txt"))); pw.println("Hello!"); pw.println("GoodBye"); System.out.println("ファイルに書き込みました。"); }catch(IOException e){ System.out.println("入出力エラーです。"); }finally{ if(pw != null){ pw.close(); } } } }

    • ベストアンサー
    • Java
  • servlet通信断時の処理について

    お世話になります。 Servletの処理中にクライアントとの通信がケーブル不良等が原因で切断された場合、エラー処理をしたいのですが、 エクセプションが発生しません。 発生させる方法は無いでしょうか。 本当に困っております。 通信断になるタイミングは 以下のコードでレスポンスデータをクライアントへ送信中に通信断になる場合です。 public void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException,IOException { try { PrintWriter pw = new PrintWriter( new OutputStreamWriter(response.getOutputStream(), "UTF-8")); pw.write("OK"); pw.flush(); pw.close(); }catch(IOException e){ // エラー処理 }catch(Exception e){ // エラー処理 }finally{ // 後処理 } } どなたかご存知の方がいらっしゃいましたらお教え下さい。

    • ベストアンサー
    • Java
  • JavaのFileWriterについて

    はじめまして。 以下のようなプログラムで、new FileWriter("test1.txt")の【test1.txt】が最終的にどの親クラスのコンストラクタ(メソッド?)に渡されて処理されるのかがわかりません。 new演算子で FileWriterオブジェクトを作成した際に、importした親クラスのFileWriterクラスにあるコンストラクタが呼び出されるのだろうとは思っています。 そこで、JavaのAPIのサイトにて、クラス FileWriterの説明(http://docs.oracle.com/javase/jp/6/api/)を読みましたが、コンストラクタが複数紹介されており、下記のプログラムに当てはまるものがどれか分かりませんでした。 また、クラス FileWriterの説明ページのコンストラクタの概要にあるpublic FileWriter(File file)というコンストラクタの場合、引数リストのFileにもリンクがあり、Fileのリンク先のページであるクラス Fileの説明(http://docs.oracle.com/javase/jp/6/api/)を読みましたが、結局test1.txtがどのクラスのコンストラクタ(メソッド?)でどのように処理されているのかが分かりません。 どうかご教示いただきたく、よろしくお願い致します。 import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; public class Sample7 { public static void main(String[] args){ PrintWriter pw = null; try{ pw = new PrintWriter (new BufferedWriter(new FileWriter("test1.txt"))); pw.println("Hello!"); pw.println("GoodBye"); System.out.println("ファイルに書き込みました。"); }catch(IOException e){ System.out.println("入出力エラーです。"); }finally{ if(pw != null){ pw.close(); } } } }

    • ベストアンサー
    • Java
  • Javaのプログラムについて教えてください!

    BufferedWriterを使ってコマンドプロンプトから文字を入力して実行時に与えたパスのテキストに書き込んでいくプログラムをコーディングしてみたのですがなかなか上手くいきません。添削をお願いします。 import java.io.*; class BW{ public static void main(String[] args){ try{ File fl = new File("args[0]"); FileWriter fw = new FileWriter(fl); BufferedWriter bw = new BufferedWriter(fw); for(int i = 0;args[i]==null;i++){ bw.write(args[i]); bw.newLine(); } bw.flush(); bw.close(); }catch(IOException e){ e.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • JAVAで外部ファイルの実行

    JAVAで外部ファイルを実行したいのですが、 myjbutton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ Runtime myruntime=Runtime.getRuntime(); try{Process myprocess=myruntime.exec("cmd.exe");}catch(IOException e){}; }}); ボタンを押して、実行させたいのですが、これが 全く起動しません。notepad.exeなども試しました が無理でした。 アドバイスがあれば、教えてください。お願いします。

    • ベストアンサー
    • Java
  • java classの呼び出し方を教えて下さい。

    java classの呼び出し方を教えて下さい。 public class test extends Applet implements Runnable,ActionListener,KeyListener{ Thread th; // スレッド宣言 AudioClip IdoSound,KaitenSound,KesiSound,SetSound,CrySound; public void init(){ }   ・   ・   ・ public void test(){ ここで、最下欄の class stream{ public static void main(String args[]){ } を実行させたいのですが、記入方法が解りません・・・ } public int kesiOne(int VP,int HP){ }    ・    ・    ・ class stream{ public static void main(String args[]){ try{ File file = new File("c:\\java\\data.txt"); if (checkBeforeWritefile(file)){ PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file))); pw.println("12345"); pw.close(); }else{ System.out.println("ファイルに書き込めません"); } }catch(IOException e){ System.out.println(e); } } private static boolean checkBeforeWritefile(File file){ if (file.exists()){ if (file.isFile() && file.canWrite()){ return true; } } return false; } } 解りにくい書き方で申し訳け有りませんが、宜しくお願いします。

  • JavaのTCPソケット通信プログラムについて

    初めてJavaでTCPソケット通信を書いてみたのですが、質問です。ソケット通信をサーバーとクライアント側で確立した後、メッセージの送受信をやるとても簡素なプログラムを作成しました。一回目の送受信をするだけだと上手くいくのですが、同じコネクション内で二回目の送受信をするよう追記したところ動作がおかしくなりました。(一つ目のメッセージも受信しないまま画面が停止した状態になる)何が問題なのでしょうか。 (Receiver.java) public class Receiver { public static final int PORT = 30000; public static void main(String[] args) { try { ServerSocket serverSoc = new ServerSocket(PORT); Socket socket = null; System.out.println("Waiting for Connection.."); socket = serverSoc.accept(); System.out.println("Connection from "+socket.getInetAddress()); // receive message BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); System.out.println("Message from sender ="+new String(br.readLine())); //send message←ここを追記するとおかしくなりました。 String message = "Hey This is receiver"; BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); System.out.println("I will send: "+message); bw.write(message); br.close(); bw.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } (Sender.java) public class Sender { public static final int PORT = 30000; public static void main(String[] args) { try { InetAddress LocalHost = InetAddress.getLocalHost(); InetSocketAddress socketAddress = new InetSocketAddress(LocalHost, PORT); Socket socket = new Socket(); socket.connect(socketAddress, 10000); //send message String message = "Hey This is sender"; BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); System.out.println("I will send: "+message); bw.write(message); // receive message←同じくここを追記するとおかしくなりました。 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); System.out.println("Message from receiver ="+new String(br.readLine())); br.close(); bw.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }

  • Javaを使ったチャットシステムについて

    はじめまして。 チャットシステムを作ろうと思い他の方が制作されたソースコードを拝見させて頂いたのですがよくわかりませんでした。 よろしければ教えて頂けないでしょうか? よくわからなかったのは読込・書込処理の部分です。 どういう流れで会話のやり取りが行われているのかよくわかりません。 例えば、Aさんが書き込んでBさんがその書き込みを見るまで、のような一連の流れです。 ・読込処理 URL wi_url = new URL(p_url+"chat1.cgi"); URLConnection wi_connect = wi_url.openConnection(); wi_connect.setDoInput(true); wi_connect.setDoOutput(true); wi_connect.setUseCaches(false); OutputStream wo_stream = wi_connect.getOutputStream(); BufferedWriter wo_buffer = new BufferedWriter(new OutputStreamWriter(wo_stream)); wo_buffer.write("read", 0, 4); wo_buffer.flush(); wo_buffer.close(); InputStream wi_stream = wi_connect.getInputStream(); BufferedReader wi_buffer= new BufferedReader(new InputStreamReader(wi_stream)); ・書込処理 URL wo_url = new URL(p_url+"chat2.cgi"); URLConnection wo_connect = wo_url.openConnection(); wo_connect.setDoOutput(true); wo_connect.setDoInput(true); wo_connect.setUseCaches(false); OutputStream wo_stream = wo_connect.getOutputStream(); BufferedWriter wo_buffer = new BufferedWriter(new OutputStreamWriter(wo_stream)); wo_buffer.write(w_data, 0, w_data.length()); wo_buffer.flush(); wo_buffer.close(); InputStream wi_stream = wo_connect.getInputStream(); BufferedReader wi_buffer = new BufferedReader(new InputStreamReader(wi_stream));

  • javaからバッチファイル実行

    お世話になります。 javaプログラムからバッチファイルを呼び出して実行するようにしたいのですが、上手くいきません。 サイトを参考に以下のように書いてみましたが、 バッチファイルの一行目のみ実行している?ようで、二行目以降の処理をしていないようです。 バッチファイル単体での実行は正常に動作しています。 お気づきの点がありましたら教えて頂けないでしょうか。 try { String[] cmd = {"バッチファイルのパス"}; Process p = Runtime.getRuntime().exec(cmd); while(true){ try{ p.exitValue(); }catch(IllegalThreadStateException e){ continue; } break; } } catch (IOException e) { e.printStackTrace(); }

    • ベストアンサー
    • Java
  • Javaの簡易クライアント

    メールの閲覧ができるプログラムを作成してコンパイルして実行はできるのですが閲覧ができずエラーが出てしまいます。 正しいソースコードを教えてください。プログラムに詳しい方宜しくお願いします。 画像は実行結果です。 import java.io.*; import java.net.*; public class mail2 { public static void main(String args[]) throws IOException { String server,user,pass,str,num; int port = 110; StringBuffer sb = new StringBuffer(""); Socket sock; BufferedReader sockin; BufferedWriter sockout; System.out.println("サーバーを入力"); BufferedReader serverin = new BufferedReader(new InputStreamReader(System.in)); server = serverin.readLine(); System.out.println("ユーザーを入力"); BufferedReader userin = new BufferedReader(new InputStreamReader(System.in)); user = userin.readLine(); System.out.println("パスワードを入力"); BufferedReader passin = new BufferedReader(new InputStreamReader(System.in)); pass = passin.readLine(); try { sock = new Socket(server, port); sockin = new BufferedReader(new InputStreamReader(sock.getInputStream())); sockout = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); sockout.write("USER " + user + "\r\n"); sockout.write("PASS " + pass + "\r\n"); sockout.write("LIST\r\n"); sockout.write("QUIT\r\n"); sockout.flush(); while ((str = sockin.readLine()) != null) { System.out.println(str); } sockout.close(); sockin.close(); sock.close(); } catch (Exception ex) { ex.printStackTrace(); } System.out.println("どのメールを見ますか?"); BufferedReader numin = new BufferedReader(new InputStreamReader(System.in)); num = numin.readLine(); try { sock = new Socket (server, port); sockin = new BufferedReader(new InputStreamReader(sock.getInputStream())); sockout = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); sockout.write("USER " + user + "\r\n"); sockout.write("PASS " + pass + "\r\n"); sockout.write("RETR " +num+"\r\n"); sockout.write("QUIT\r\n"); sockout.flush(); while ((str = sockin.readLine()) != null) { System.out.println(str); } sockout.close(); sockin.close(); sock.close(); } catch (Exception ex) { ex.printStackTrace(); } } }

    • ベストアンサー
    • Java

専門家に質問してみよう