有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用JavaPlot的java Spectrogram不起作用

我正在尝试使用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'

问题是上面的代码根本没有显示任何图像,它是全白色的。但是,前面的命令可以正常工作,并且可以恢复数据。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) 个答案

  1. # 1 楼答案

    由于无法修复该错误,我最终决定调用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();
    

    这很有效!:D

  2. # 2 楼答案

    你使用的数据集有多大

    我在使用JavaPlot时注意到,它确实不喜欢大数据集。当JavaPlot与gnuplot对话时,就好像出现了一个bug,每次绘制一个数据点的图形时,它都有一个小的翻转机会。对于少量的数据来说,这不是一个问题,但这使得绘制更大的数据(>;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();