Gnuplot从python发送换行符和“,\”

时间:2011-07-27 00:27:23

标签: python gnuplot

通常在使用交互式gnuplot时我会这样做:

gnuplot> plot "state_log_6548032.data" using 4 with lines lt -1 lw 0.5 title "X axis" ,\
>"state_log_6548032.data" using 5 with lines lt 1 lw 0.5 title "Y axis" ,\
>"state_log_6548032.data" using 6 with lines lt 2 lw 0.5 title "Z axis"

然而,当我尝试使用子进程从python中做同样的事情时:

gnuplot.write( "plot \"%s\" using 1 with lines lt -1 lw 0.5 title 'X axis' ,\ \n" %filename )
gnuplot.write( "plot \"%s\" using 2 with lines lt 1 lw 0.5 title 'Y axis' ,\ \n" %filename )
gnuplot.write( "plot \"%s\" using 3 with lines lt 2 lw 0.5 title 'Z axis' \n" %filename )

我收到以下错误:

gnuplot> plot "state_log_6548032.data" using 1 with lines lt -1 lw 0.5 title 'X axis' ,\ 
                                                                                       ^
         line 0: invalid character \

gnuplot> plot "state_log_6548032.data" using 2 with lines lt 1 lw 0.5 title 'Y axis' ,\ 
                                                                                      ^
         line 0: invalid character \

我花了很多时间试图弄清楚它是否是python的问题,但我发现这是gnuplot的问题,当从控制台调用时出于某种原因使用转义字符,但不是必需的在我的情况下。但问题仍然存在。如何通过管道指令从python子进程绘制连续行中^^的数据,或者从python创建一个gnu文件并调用gnuplot子进程来使用该文件?

编辑:

对于那些可能会陷入这个简单小事的人:正如下面由保持这个社区活着的好人解释的那样,当你使用“\”时,Python会逃脱“\”。 所以解决方案很简单:

gnuplot.write( "plot \"%s\" using 1 with lines lt -1 lw 0.5 title 'X axis' ,\\\n" %filename )
        gnuplot.write( "\"%s\" using 2 with lines lt 1 lw 0.5 title 'Y axis' ,\\\n" %filename )
        gnuplot.write( "\"%s\" using 3 with lines lt 2 lw 0.5 title 'Z axis' \n" %filename )

4 个答案:

答案 0 :(得分:4)

在您发布的命令行gnuplot示例中,您转义换行符以避免屏幕中有一英里长的行,但仍然将数据tu gnuplot作为一行发送。

如果您手动输入数据,这很酷,但如果您以编程方式进行操作,为什么还要关心?只需发送一行,Python就不会抱怨可读性:)。如果您对问题是什么感到好奇,那是因为Python 也使用\作为转义序列,因此该字符永远不会到达gnuplot

也就是说,有python-gnuplot库来处理所有这些脏工作。看看吧!

答案 1 :(得分:1)

我认为当你在Python中执行\(反向空间)时,你正在逃避空间,我认为当你做\然后点击进入gnuplot你就逃脱了换行符。

你最后只用,\n尝试了吗,这是逃避换行的python方法吗?仅使用,,(逗号空间)?只有\n

也许,如果你必须逃离换行符,那么它并不是必需的,只有,才能分离命令。

答案 2 :(得分:1)

要向gnuplot提供文字反斜杠,请在Python字符串中使用\\(与使用\n为其提供文字换行符的方式相同)。 \通常会启动转义序列,在您的情况下,您有\;对此没有特殊意义,所以它只是被解释为一个空格(即反斜杠被删除)。

您可以print测试字符串的内容,而不是将其传递给gnuplot.write

也就是说,很有可能你可以将整个事情放在一行上,而不是将反斜杠和新行提供给gnuplot。

答案 3 :(得分:1)

在我的Gnuplot 4.6和opensuse linux中,封闭撇号的类型和顺序很重要:gnuplot以subprocess.Popen开头,写道:

gnuplot.stdin.write("set format x '%d %h\\\n%H:%M'")

...在单行标签中将换行符打印为文字,时间为:

gnuplot.stdin.write('set format x "%d %h\\\n%H:%M"')

...按预期工作,沿时间轴生成两行标签。