2013-10-17 5 views
2

J'utilise gnuplot avec Java et il y a ce problème qui m'a rendu fou. Fondamentalement, j'utilise cette fonction pour tracer deux doubles [] tableaux sur le même terrain -Utiliser gnuplot avec Java

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"); 
} 

L'idée est d'écrire les deux doubles pour séparer les fichiers et les tracer avec gnuplot. Lorsque cette fonction est appelée une seule fois, cela fonctionne très bien. Mais quand je l'appelle à plusieurs reprises à partir d'une boucle, je vois des fichiers vides qui sont produits et d'autres qui sont faux (par exemple, les tracés diminuent parfois alors que je sais qu'ils ne le peuvent pas). Cela fonctionne correctement dans certains cas, donc c'est très aléatoire. Je sais que cela a à voir avec la façon dont je lis et écris les fichiers avant d'appeler gnuplot. Quelqu'un peut-il m'aider à améliorer cette fonction de traçage afin que je ne vois pas ce comportement étrange?

+1

Pourrait être une sorte de condition de concurrence, voir [Java: attendre le processus exec jusqu'à sa fermeture] (http://stackoverflow.com/q/12448882/2604213). – Christoph

+0

Merci Christoph. C'était exactement le problème. J'ai ajouté un Thread.sleep (10) après chaque appel à cette fonction et le problème semble être résolu. –

Répondre

3

Cela ressemble à une sorte de condition de concurrence, voir Java: wait for exec process till it exits. Effectuez les actions suivantes:

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

Cela devrait attendre la commande gnuplot à la fin.

1

Vous pouvez essayer le JavaGnuplotHybrid:

Voici le code pour le tracé doubles [] tableaux:

public void plot2d() { 
    JGnuplot jg = new JGnuplot(); 
    Plot plot = new Plot("") { 
     { 
      xlabel = "x"; 
      ylabel = "y"; 
     } 
    }; 
    double[] x = { 1, 2, 3, 4, 5 }, y1 = { 2, 4, 6, 8, 10 }, y2 = { 3, 6, 9, 12, 15 }; 
    DataTableSet dts = plot.addNewDataTableSet("2D Plot"); 
    dts.addNewDataTable("y=2x", x, y1); 
    dts.addNewDataTable("y=3x", x, y2); 
    jg.execute(plot, jg.plot2d); 
} 

enter image description here

Il est très simple et direct. Pour plus de détails: https://github.com/mleoking/JavaGnuplotHybrid