0

このコードでJavaPlotを使用してスペクトログラムを表示しようとしています:

    PlotStyle style = new PlotStyle();
    style.setStyle(Style.IMAGE);


    DataSetPlot data = new DataSetPlot(points);
    data.setPlotStyle(style);


    JavaPlot plot = new JavaPlot();
    plot.addPlot(data);
    plot.plot();

次のようにコマンドラインでgnuplotを使用すると、ポイントが有効になります。

 gnuplot --persist -e 'plot "data.dat" w image'

問題は、上記のコードでは画像がまったく表示されず、すべて白であることです。ただし、前のコマンドは正常に機能し、data.dat にはまったく同じ形式のポイントが含まれています。コードを実行してもエラーは表示されません。

いくつかのポイント データの例を次に示します。

0.0 193.0 0.18183826861232413
0.0 194.0 0.2467637036800797
0.0 195.0 0.43531750893288235
0.0 196.0 0.3893599780473012
0.0 197.0 0.3220816458659573
0.0 198.0 0.25389713892289173
0.0 199.0 0.22935136709597423
1.0 0.0 0.23021155472288352
1.0 1.0 0.33383157107150707
1.0 2.0 0.3745792715533692
1.0 3.0 2.028348052193793
1.0 4.0 2.4150235476868978
1.0 5.0 2.4169194327766736
1.0 6.0 1.8633442057577019
1.0 7.0 4.2682342944471054
1.0 8.0 3.22544345282322

そして、これは JavaPlot によって gnuplot に送られるコマンドです:

set multiplot layout 1,2 rowsfirst downwards
_gnuplot_error = 1
plot '-' title 'Datafile 1' with image ; _gnuplot_error = 0
0.0 9.0 6.612583996900796 
1.0 9.0 4.719585678813712 
2.0 9.0 0.5475948495661151 
3.0 9.0 0.7385211622757041 
4.0 9.0 0.711512824841686 
5.0 9.0 3.7572382303712604 
6.0 9.0 1.0818137070547578 
7.0 9.0 0.057188125070687344 
8.0 9.0 0.8218555010675036 
9.0 9.0 5.754170136586405 
e
if (_gnuplot_error == 1) print '_ERROR_'
unset multiplot
quit

この例では、10x10 ポイントを取得したため、渡される座標は次のようになります。

0.0 0.0 6.612583996900796 
0.0 1.0 4.719585678813712 
0.0 2.0 0.5475948495661151 
0.0 3.0 0.7385211622757041 
0.0 4.0 0.711512824841686 
0.0 5.0 3.7572382303712604 
0.0 6.0 1.0818137070547578 
0.0 7.0 0.057188125070687344 
0.0 8.0 0.8218555010675036 
0.0 9.0 5.754170136586405 
1.0 0.0 6.612583996900796 
1.0 1.0 4.719585678813712 
1.0 2.0 0.5475948495661151 
1.0 3.0 0.7385211622757041 
1.0 4.0 0.711512824841686 
1.0 5.0 3.7572382303712604 
1.0 6.0 1.0818137070547578 
1.0 7.0 0.057188125070687344 
1.0 8.0 0.8218555010675036 
1.0 9.0 5.754170136586405 
...
9.0 9.0 xxxxxxxxxxxxx

JavaPlot が Y 座標を反復していないようです。

誰かが私が間違っていることを知っていますか?

4

2 に答える 2

0

そのエラーを修正できなかったので、最終的に gnuplot を呼び出して自分でポイントを正しく渡すことにしました。スペクトログラムを描画するために使用したコードは次のとおりです。

Process p = Runtime.getRuntime().exec("gnuplot --persist");

BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
String s = "plot '-' title 'Spectogram' w image\n";
writer.write(s);
writer.flush();

for(int m = 0; m < x.length; m++){
   for(int k = 0; k < x[0].length; k++){
       s = m + " " + k + " " + x[m][k] + "\n";
       writer.write(s);  
       writer.flush();
   }
}

s = "e\n";
writer.write(s);
writer.flush();

そしてそれはうまくいきます!:D

于 2012-07-23T20:44:35.670 に答える
0

どのくらいの大きさのデータセットを使用していますか?

JavaPlot を使用していて気づいたことは、JavaPlot は大きなデータ セットがあまり好きではないということです。JavaPlot が gnuplot と対話するときにバグが発生し、データ ポイントがグラフ化されるたびに、反転する可能性がわずかにあるようです。少量のデータでは問題ありませんが、大きなデータ (> 1000) をグラフ化することはほとんど不可能です。行が正しく入力されていないようで、その行以降のすべての行が次のようになります。

multiplot> 53.86510713480712 67.8601980449745 53.557782725560635 
       ^
       invalid command

より小さなデータセットを使用してみて、それが機能するかどうかを確認してください。この場合、私が知っている唯一の対処方法は、データ セットを分割するか、jgnuplot のような別のラッパー ライブラリを使用することです-> http://jgnuplot.sourceforge.net/

また、新しいグラフを使用しているとは決して言わないことに気付きました。に変更して追加してみてください

JavaPlot plot = new JavaPlot();
plot.newGraph();  //added this line
plot.plot();
于 2012-07-23T15:25:23.453 に答える