使用Java Plot的频谱图不起作用

时间:2012-07-23 15:07:57

标签: java gnuplot 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

这是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坐标。

有人知道我做错了什么吗?

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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