2012-07-23 22 views
0

我試圖使用顯示與JavaPlot這段代碼頻譜圖:頻譜圖使用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 

這是sended通過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 

對於這個例子,我花了10×10點,所以通過座標應該是這樣的:

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座標阿泰。

有人知道我做錯了什麼嗎?

+0

有沒有辦法檢查JavaPlot管道,看看gnuplot實際上看到了什麼命令? – mgilson 2012-07-23 15:09:28

+0

我該怎麼做? – aitorkun 2012-07-23 15:15:21

+0

不知道(我不知道java),但是,它肯定是可能的,因爲它是由另一個用戶完成的:http://stackoverflow.com/q/11396616/748858 - 也許而不是發送到'gnuplot。 exe',將它發送到另一個從stdin讀取的程序,並寫入一個臨時文件... – mgilson 2012-07-23 15:18:12

回答

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

0

您使用的數據集有多大?

我在使用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(); 
+0

嗯...有200×200點:P我會用更少的 – aitorkun 2012-07-23 15:40:57

+0

這麼40000試試?嘗試40,看看是否有效。如果有,請嘗試400並多次生成圖表。如果你有我做的問題,它應該工作一些時間和失敗(創建白色屏幕)其他時間 – Daniel 2012-07-23 15:44:07

+0

好吧,我已經試過只用5×100點和問題依然存在...... – aitorkun 2012-07-23 15:44:30