2

私はJavaでgnuplotを使用していますが、私を夢中にさせているこの問題があります。基本的に、この関数を使用して、2 つの double[] 配列を同じプロットにプロットしています -

public static void plot(String filename,double[] ua1,double[] ua2) throws IOException{
    if(ua1.length==0 | ua2.length==0){
        System.out.println("This one had no data - " + filename);
        return;
    }
    File fold1 = new File("old");
    if(fold1.exists()){
        boolean a = fold1.delete();
        if(!a)System.out.println("Houstoonnn!!!");
    }
    fold1 = new File("new");
    if(fold1.exists()){
        boolean a = fold1.delete();
        if(!a)System.out.println("Not deleted!!!");
    }
    FileWriter outF1 = new FileWriter("old");
    FileWriter outF2 = new FileWriter("new");
    PrintWriter out1 = new PrintWriter(outF1);
    PrintWriter out2 = new PrintWriter(outF2);
    for(int j=0;j < ua1.length;j++){
        out1.println(ua1[j]);
        out2.println(ua2[j]);
    }
    out1.close();
    out2.close();
    File fold2 = new File("auxfile.gp");
    try{//If the file already exists, delete it..
        fold2.delete();
    }
    catch(Exception e){}
    FileWriter outF = new FileWriter("auxfile.gp");
    PrintWriter out = new PrintWriter(outF);
    out.println("set terminal gif");
    out.println("set output \""+ filename+".gif\"");
    out.print("set title " + "\""+filename+"\"" + "\n");
    out.print("set xlabel " + "\"Time\"" + "\n");
    out.print("set ylabel " + "\"UA\"" + "\n");
    out.println("set key right bottom");
    out.println("plot \"old\" with linespoints,\"new\" with linespoints");
    out.close();// It's done, closing document.
    Runtime.getRuntime().exec("gnuplot auxfile.gp");
}

アイデアは、両方の double を別々のファイルに書き込んで、gnuplot でプロットすることです。この関数が一度だけ呼び出されると、問題なく動作します。しかし、ループから繰り返し呼び出すと、いくつかの空のファイルが生成され、他のファイルが間違っていることがわかります (たとえば、プロットは、できないことがわかっているにもかかわらず、何度か減少します)。場合によっては正しく動作するため、これは非常にランダムです。gnuplot を呼び出す前にファイルを読み書きする方法に関係があることはわかっています。この奇妙な動作が見られないように、このプロット機能を改善するのを手伝ってくれる人はいますか?

4

2 に答える 2

3

これはある種の競合状態のように見えます。 Java: wait for exec process until it exits を参照してください。次のことを試してください。

Runtime commandPrompt = Runtime.getRuntime();
commandPrompt.exec("gnuplot auxfile.gp");
commandPrompt.waitFor();

gnuplotこれは、コマンドが終了するまで待機する必要があります。

于 2013-10-17T20:10:22.123 に答える