2012-07-23 65 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