Gnuplot如何从Python发送换行符和反斜杠"\"?

4

通常在交互式使用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 )

你尝试过gnuplot模块吗?另外,如果可以的话,我建议使用matplotlib进行绘图。 - Keith
@Keith,我在Debian上安装了python-gnuplot-1.8,但是找不到任何关于如何使用它的文档。它似乎没有维护了。我之前不知道matplotlib,非常感谢你提供的链接,这似乎更符合我最初的需求! - Ælex
4个回答

5
在你发布的命令行gnuplot示例中,你 转义换行符 以避免屏幕上出现超长的行,但仍将数据作为一行发送给gnuplot。

如果您是手动输入数据,则这很酷,但如果您以编程方式处理数据,则为什么要关心呢?只需发送一行,Python不会抱怨可读性:)。如果您想知道问题所在,那么原因在于Python也使用 \ 作为转义序列,因此该字符永远不会到达 gnuplot

话虽如此,有python-gnuplot库可以处理所有这些繁琐的工作。快去试试吧!


我并不在意如何实现,但这是我知道的在gnuplot中发送命令的唯一方法。agf在我发布的另一个问题中告诉我可以创建一个tmp文件,将命令放在那里,并逐个将它们提供给gnuplot。我还考虑过将所有命令输出到gnu文件中,并调用gnuplot加载该文件。但目前为止,我仍然无法使上述代码正常工作。 - Ælex

1
在我的Gnuplot 4.6和opensuse linux中,封闭单引号的类型和顺序很重要:如果使用subprocess.Popen启动gnuplot,则应写成:
gnuplot.stdin.write("set format x '%d %h\\\n%H:%M'")

在单行标签中,当打印换行符时,应将其作为字面量处理。
gnuplot.stdin.write('set format x "%d %h\\\n%H:%M"')

...正常工作,沿着时间x轴生成双行标签。


1

我认为在Python中执行\(反斜杠空格)时,你正在转义空格,在gnuplot中执行\然后按回车键时,你正在转义换行符。

你尝试过只用,\n这样的结尾吗?这是Python中转义换行符的方式。只使用,或者, (逗号空格)这样的结尾?或只使用\n

如果必须转义换行符,那么可能并不是必要的。只使用,就可以分开命令。


你好 agf。我尝试了:,\n,但是出现了以下错误:第0行:无法绘制函数。 我还尝试了:\n,虽然它可以工作,但只会绘制第一行。 最后我尝试了:,\\n,它成功了 :) 很抱歉打扰你了。我现在会尝试按照你在我的另一个问题中建议的使用文件来自动化它。 - Ælex
我试图通过\来转义空格,但它们仍然将我送回地球。 - wander95

1
为了将一个反斜杠传递给gnuplot,请在Python字符串中使用\\(就像您使用\n来传递一个字面换行符一样)。 \通常开始转义序列,在您的情况下,您有\;对于这个没有特殊含义,因此它被解释为空格(即反斜杠被删除)。
您可以通过print而不是将其传递给gnuplot.write来测试字符串的内容。
话虽如此,很有可能您可以将整个内容放在一行上,而不是将反斜杠和换行符传递给gnuplot。

我已经得到了python-gnuplot-1.8,但是我找不到任何关于如何使用它的文档! - Ælex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接