使用JavaPlot的spectrogram不起作用

使用JavaPlot的spectrogram不起作用,java,gnuplot,javaplot,Java,Gnuplot,Javaplot,我正在尝试使用JavaPlot和以下代码显示spectrogram: PlotStyle style = new PlotStyle(); style.setStyle(Style.IMAGE); DataSetPlot data = new DataSetPlot(points); data.setPlotStyle(style); JavaPlot plot = new JavaPlot(); plot.addPlot(data);

我正在尝试使用JavaPlot和以下代码显示spectrogram:

    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坐标


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

您使用的数据集有多大

我在使用JavaPlot时注意到,它确实不喜欢大数据集。当JavaPlot与gnuplot对话时,就好像出现了一个bug,每次绘制数据点时,它都有一个很小的翻转机会。对于少量的数据来说,这不是一个问题,但这使得绘制更大的数据(>1000)几乎是不可能的。看起来输入的行不正确,并且在该行之后的所有行都会出现以下情况:

multiplot> 53.86510713480712 67.8601980449745 53.557782725560635 
       ^
       invalid command
尝试使用较小的数据集,看看它是否有效。如果是这种情况,我所知道的处理它的唯一方法就是分解数据集或尝试使用另一个包装器库,如jgnuplot-->

另外,我注意到你从未说过你正在使用一个新的图表。尝试将其添加到

JavaPlot plot = new JavaPlot();
plot.newGraph();  //added this line
plot.plot();

由于无法修复该错误,我最终决定调用gnuplot并自己正确地传递这些点。下面是我用来绘制spectrogram的一段代码:

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();
processp=Runtime.getRuntime().exec(“gnuplot--persist”);
BufferedWriter writer=新的BufferedWriter(新的OutputStreamWriter(p.getOutputStream());
字符串s=“绘图”-“标题”spectrogram“w图像\n”;
作者:写;
writer.flush();
对于(int m=0;m

它是有效的!:D

有没有办法检查JavaPlot管道以查看gnuplot实际看到了什么命令?不确定(我不知道java),但是,这肯定是可能的,因为它是由另一个用户完成的:--可能不是将它发送到
gnuplot.exe
,将它发送到另一个程序,该程序读取标准数据并写入一个临时文件…最后我得到了输出:设置多点布局1,2行first down gnuplot_error=1 plot'-'title'Datafile 1'和图像_gnuplot_error=0.0 199.0 0.0 1.0 199.0 0.0 2.0 199.0 0 0.0 3.0 199.0 0 0.0 4.0 199.0 0 0 0 0.0 e如果(_gnuplot_error==1)打印“_error”未设置多点quitso 40000?试试40,看看是否有效。如果是,请尝试400并多次生成图形。如果你遇到了我遇到的问题,它应该可以运行几次,然后在其他时间失败(创建白色屏幕),试着运行几次,如果仍然不起作用,试着打5分。如果它仍然不起作用,这不是你的问题。你能看看gnuplot发送了什么吗?终端应该和窗口一样弹出。我看到“警告:图像网格必须至少为2 x 2”。很抱歉,我不知道。我将进一步研究它,但我对gnuplot或JavaPlot没有太多经验。希望其他人能给我们一些启示。