从python调用gnuplot

And*_*anu 19 python gnuplot

我有一个python脚本,经过一些计算后会生成两个格式为gnuplot输入的数据文件.

我如何从python'调用'gnuplot?

我想将以下python字符串作为输入发送到gnuplot:

"plot '%s' with lines, '%s' with points;" % (eout,nout)
Run Code Online (Sandbox Code Playgroud)

其中" EOUT "和" NOUT "是两个文件名.

PS:我宁愿不使用额外的Python模块,只有标准的API(例如gnuplot的-PY).

谢谢

sth*_*sth 23

subprocess模块允许您调用其他程序:

import subprocess
plot = subprocess.Popen(['gnuplot'], stdin=subprocess.PIPE)
plot.communicate("plot '%s' with lines, '%s' with points;" % (eout,nout))
Run Code Online (Sandbox Code Playgroud)


小智 16

在Doug Hellemann的本周Python模块中非常清楚地解释了子流程

这很好用:

import subprocess
proc = subprocess.Popen(['gnuplot','-p'], 
                        shell=True,
                        stdin=subprocess.PIPE,
                        )
proc.stdin.write('set xrange [0:10]; set yrange [-2:2]\n')
proc.stdin.write('plot sin(x)\n')
proc.stdin.write('quit\n') #close the gnuplot window
Run Code Online (Sandbox Code Playgroud)

也可以使用"通信",但绘图窗口会立即关闭,除非使用gnuplot pause命令

proc.communicate("""
set xrange [0:10]; set yrange [-2:2]
plot sin(x)
pause 4
""")
Run Code Online (Sandbox Code Playgroud)

  • 如果你只想显示窗口,请使用`shell = False`和gnuplot` --persist`,而不要让Python关闭它... (2认同)

Nea*_*eal 7

一个简单的方法可能是编写包含gnuplot命令的第三个文件,然后告诉Python使用该文件执行gnuplot.说你写

"plot '%s' with lines, '%s' with points;" % (eout,nout)
Run Code Online (Sandbox Code Playgroud)

到一个名为tmp.gp的文件.然后你可以使用

from os import system, remove
system('gnuplot tmp.gp')
remove('tmp.gp')
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这个黑客最终奏效了.一提到:系统('gnuplot -persist tmp.gp'),以便在脚本完成后保留窗口. (4认同)

小智 5

我试图做类似的事情,但另外我想从python中提供数据并输出图形文件作为变量(因此数据和图形都不是实际文件).这就是我想出的:

#! /usr/bin/env python

import subprocess
from sys import stdout, stderr
from os import linesep as nl

def gnuplot_ExecuteCommands(commands, data):
    args = ["gnuplot", "-e", (";".join([str(c) for c in commands]))]
    program = subprocess.Popen(\
        args, \
        stdin=subprocess.PIPE, \
        stdout=subprocess.PIPE, \
        stderr=subprocess.PIPE, \
        )
    for line in data:
        program.stdin.write(str(line)+nl)
    return program

def gnuplot_GifTest():
    commands = [\
        "set datafile separator ','",\
        "set terminal gif",\
        "set output",\
        "plot '-' using 1:2 with linespoints, '' using 1:2 with linespoints",\
        ]
    data = [\
        "1,1",\
        "2,2",\
        "3,5",\
        "4,2",\
        "5,1",\
        "e",\
        "1,5",\
        "2,4",\
        "3,1",\
        "4,4",\
        "5,5",\
        "e",\
        ]
    return (commands, data)

if __name__=="__main__":
    (commands, data) = gnuplot_GifTest()
    plotProg = gnuplot_ExecuteCommands(commands, data)
    (out, err) = (plotProg.stdout, plotProg.stderr)
    stdout.write(out.read())
Run Code Online (Sandbox Code Playgroud)

该脚本将图形转储到stdout作为main的最后一步.等效的命令行(图形通过管道输出到'out.gif')将是:

gnuplot -e "set datafile separator ','; set terminal gif; set output; plot '-' using 1:2 with linespoints, '' using 1:2 with linespoints" > out.gif
1,1
2,2
3,5
4,2
5,1
e
1,5
2,4
3,1
4,4
5,5
e
Run Code Online (Sandbox Code Playgroud)