GNUplot stdin,如何绘制多行?

时间:2013-11-22 03:59:42

标签: python gnuplot stdin

好的,我正在以例如:

的形式将数据传输到GNUplot
2013-11-04 20:00:12,875,350,112,29,38,4,44,10,632,121

我在Python代码中设置了以下内容:

gnuplot.stdin.write("plot '-' u 1:2 t 'aa',\
'' u 1:3 t 'aa in',\
'' u 1:4 t 'bb',\
'' u 1:5 t 'bb in',\
'' u 1:6 t 'cc',\
'' u 1:7 t 'cc in',\
'' u 1:8 t 'dd',\
'' u 1:9 t 'dd in',\
'' u 1:10 t 'ee';\n")

<击> 但是我不断收到错误,例如:

gnuplot> plot '-' u 1:2 t 'aa',    '' u 1:3 t 'aa in',    '' u 1:4 t 'bb',    '' u 1:5 t 'bb in',    '' u 1:6 t 'cc',    '' u 1:7 t 'cc in',    '' u 1:8 t 'dd',    '' u 1:9 t 'dd in',    '' u 1:10 t 'ee';
                                                   ^
         line 1271: warning: Skipping data file with no valid points

任何想法?

<击> ###更新:###

<击>

基于@Christoph的反馈;这是我目前正在使用的代码:

cur.execute(sql)
data = cur.fetchall()

c = 0            
for k in data:
    dataElement = data[c]    
    gnuplot.stdin.write("plot '-' u 1:2 t 'aa',\
    '' u 1:3 t 'aa in',\
    '' u 1:4 t 'bb',\
    '' u 1:5 t 'bb in',\
    '' u 1:6 t 'cc',\
    '' u 1:7 t 'cc in',\
    '' u 1:8 t 'dd',\
    '' u 1:9 t 'dd in',\
    '' u 1:10 t 'ee';\n")

    gnuplot.stdin.write("%s,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i\n" % dataElement[:])
    gnuplot.stdin.write("e\n")
    c = c + 1

<击>

3 个答案:

答案 0 :(得分:2)

您必须为每个'-'编写一个自己的数据块。 ''仅保存您重新输入文件名,但不会重复使用数据。考虑例如以下gnuplot脚本:

plot '-', '-'
2
4
6
e
10
12
14
e

还要确保您的分隔符设置正确:set datafile separator ','

这是一个最小的python脚本,它绘制了stdin的两个数据集,其中的列用逗号分隔:

#!/usr/bin/env python
import subprocess

gnuplot = subprocess.Popen(["gnuplot"], stdin=subprocess.PIPE)

gp_wrt = gnuplot.stdin.write

gp_wrt("set terminal pngcairo\n")
gp_wrt("set output 'test.png'\n")
gp_wrt("set datafile separator ','\n")
gp_wrt("plot '-' with lines title 'mytitle',\
'-' with lines title 'other title'\n")
for i in range(11):
    gp_wrt("{},{}\n".format(i, i**2))
gp_wrt("e\n")

for i in range(11):
    gp_wrt("{},{}\n".format(i, (0.5*i)**2))
gp_wrt("e\n")

因此,对于您的数据,它可能看起来像

gnuplot.stdin.write("plot '-' u 1:2 t 'aa',\
    '' u 1:3 t 'aa in',\
    '' u 1:4 t 'bb',\
    '' u 1:5 t 'bb in',\
    '' u 1:6 t 'cc',\
    '' u 1:7 t 'cc in',\
    '' u 1:8 t 'dd',\
    '' u 1:9 t 'dd in',\
    '' u 1:10 t 'ee';\n")

for i in range(10):
    for dataElement in data:
        gnuplot.stdin.write("%s,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i\n" % dataElement[:])
    gnuplot.stdin.write("e\n")

但在这种情况下你可以简单地使用:

gnuplot.stdin.write("plot '-' u 1:2 t 'aa',\
    '' u 1:2 t 'aa in',\
    '' u 1:2 t 'bb',\
    '' u 1:2 t 'bb in',\
    '' u 1:2 t 'cc',\
    '' u 1:2 t 'cc in',\
    '' u 1:2 t 'dd',\
    '' u 1:2 t 'dd in',\
    '' u 1:2 t 'ee';\n")

for i in range(10):
    for dataElement in data:
        gnuplot.stdin.write("%s,%i\n" % (dataElement[0], dataElement[i])
    gnuplot.stdin.write("e\n")

即。每次只写相关列。

答案 1 :(得分:2)

以下代码解决了这个问题:

gnuplot.stdin.write("plot '-' u 1:2 t 'aa', " + \
            " '-' u 1:2 t 'aa in', " + \
            "'-' u 1:2 t 'bb', " + \
            "'-' u 1:2 t 'bb in', " + \
            "'-' u 1:2 t 'cc', " + \
            "'-' u 1:2 t 'cc in', " + \
            "'-' u 1:2 t 'dd', " + \
            "'-' u 1:2 t 'dd in', " + \
            "'-' u 1:2 t 'ee', " + \
            "'-' u 1:2 t 'ee in';\n")

for n in range(10):
    for dataElement in data:        
        a = n + 1
        if a == 11:
            break
        else:
            gnuplot.stdin.write("%s,%i\n" % (dataElement[0],dataElement[a]))
    gnuplot.stdin.write("e\n")
gnuplot.stdin.flush()

答案 2 :(得分:0)

将空格分隔的数据换行到此工具:

https://github.com/dkogan/feedgnuplot

它会向gnuplot提供正确的命令,并制作情节。如果你想从中获取一个gnuplot脚本,请使用--dump。