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

您正在使用多大的数据集?

我在使用 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 回答
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 回答