使用gnuplot与Java Runtime在同一张PNG生成3幅图失败问题
问题分析与解决
问题根源
你当前的写法是启动三个独立的gnuplot进程,每个进程都是全新的会话:
- 第一个进程执行
plot后,会关闭PNG输出文件 - 第二个进程启动后执行
replot,但这个全新会话里没有任何已绘制的图形,replot不会产生任何内容,还会覆盖掉第一个进程生成的文件 - 第三个进程同理,最终输出文件因无有效绘图内容而为空
修复方案
把所有绘图逻辑放在同一个gnuplot进程中执行,这样replot能基于之前的绘图会话生效。修改后的代码如下:
public static void main(String[] args) throws IOException, InterruptedException { // 将所有绘图命令合并到同一个gnuplot进程中执行 String[] cmd = {"gnuplot", "-e", "set terminal png; set output 'plotS.png'; " + "plot 'graficoS.txt' using 1:2 with lines; " + "replot 'graficoI.txt' using 1:3 with lines; " + "replot 'graficoR.txt' using 1:4 with lines"}; // 启动单个进程执行所有命令 Process process = Runtime.getRuntime().exec(cmd); process.waitFor(); // 同时读取标准输出和错误输出,方便排查问题 BufferedReader stdoutReader = new BufferedReader(new InputStreamReader(process.getInputStream())); BufferedReader stderrReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); String line; System.out.println("标准输出:"); while ((line = stdoutReader.readLine()) != null) { System.out.println(line); } System.out.println("错误输出:"); while ((line = stderrReader.readLine()) != null) { System.out.println(line); } stdoutReader.close(); stderrReader.close(); }
额外建议
- 始终读取
gnuplot的错误输出,很多时候空文件是因为数据文件路径错误、格式不对等问题,错误输出会给出明确提示 - 如果命令过长,也可以把所有
gnuplot命令写入一个临时脚本文件(比如plot_script.gp),然后调用gnuplot plot_script.gp执行,可读性更好
内容的提问来源于stack exchange,提问作者Gongas04
相关产品推荐
相关产品推荐

