通过python(python-gnuplot)使用gnuplot一次绘制所有文件

时间:2017-02-01 00:31:24

标签: python python-2.7 gnuplot

要求是使用python脚本一次性绘制目录中所有特定.csv文件的两列。这非常有效:

plot_str = 'plot for [i=0:*] file=sprintf("cpu%03d.csv",i) title_s=sprintf("cpu%03d",i) file using 16:7 pt 7 ps 1 title title_s'
g_plot.__call__(plot_str)

g_plot的位置:

g_plot = Gnuplot.Gnuplot(persist=1)

然而,另外,有时在前面的步骤中涉及cpu掩码,导致非顺序文件名。例如:

$ ls -1 cpu???.csv
cpu001.csv
cpu003.csv
cpu005.csv
cpu007.csv

在这种情况下,上述命令将中止序列中第一个丢失的文件 我尝试了几种方法,大部分是从stackoverflow中获取的。我的第二次尝试(包括调试标志等):

#    the following commands are the current experiment.
    file_list = subprocess.check_output('ls -1 cpu???.csv',shell=True)
    title_list = subprocess.check_output('ls -1 cpu???.csv | sed -e \'s/.csv//\'',shell=True)

    plot_str = "plot for [i=1:words(file_list)] 'word(file_list,i)' using 16:7 pt 7 ps 1 title word(title_list,i)"

    print('flag 1')
    print(file_list)
    print('flag 2')
    print(title_list)
    print('flag 3')
    print(plot_str)

    g_plot('file_list = {0}'.format(file_list))
    g_plot('title_list = {0}'.format(title_list))
#    g_plot.__call__('file_list = "{0}"'.format(file_list))
#    g_plot('print file_list')
#    g_plot.__call__('title_list = "{0}"'.format(title_list))
#    g_plot('print title_list')

    g_plot.__call__(plot_str)

导致:

flag 1
cpu001.csv
cpu003.csv
cpu005.csv
cpu007.csv

flag 2
cpu001
cpu003
cpu005
cpu007

flag 3
plot for [i=1:words(file_list)] 'word(file_list,i)' using 16:7 pt 7 ps 1 title word(title_list,i)
         line 0: undefined variable: cpu001
gnuplot> cpu003.csv
         ^
         line 0: invalid command
gnuplot> cpu005.csv
         ^
         line 0: invalid command
gnuplot> cpu007.csv
         ^
         line 0: invalid command
         line 0: undefined variable: cpu001
gnuplot> cpu003
         ^
         line 0: invalid command
gnuplot> cpu005
         ^
         line 0: invalid command
gnuplot> cpu007
         ^
         line 0: invalid command
         line 0: undefined variable: file_list

我的最新尝试:

#    the following commands are the current experiment.
    file_list = subprocess.check_output('ls -1 cpu???.csv',shell=True).splitlines()
    title_list = subprocess.check_output('ls -1 cpu???.csv | sed -e \'s/.csv//\'',shell=True).splitlines()
#    file_list = file_list.splitlines()

    plot_str = "plot for [i=1:words(file_list)] 'word(file_list,i)' using 16:7 pt 7 ps 1 title word(title_list,i)"
#    plot_str = 'plot for [i=1:words(file_list)] file=word(file_list,i) title_s=word(title_list,i) file using 16:7 pt 7 ps 1 title title_s'

    print('flag 1')
    print(file_list)
    print('flag 2')
    print(title_list)
    print('flag 3')
    print(plot_str)

    g_plot('file_list = {}'.format(file_list))
    g_plot('title_list = {}'.format(title_list))
#    g_plot.__call__('file_list = "{0}"'.format(file_list))
#    g_plot('print file_list')
#    g_plot.__call__('title_list = "{0}"'.format(title_list))
#    g_plot('print title_list')

    g_plot.__call__(plot_str)

导致:

flag 1
['cpu001.csv', 'cpu003.csv', 'cpu005.csv', 'cpu007.csv']
flag 2
['cpu001', 'cpu003', 'cpu005', 'cpu007']
flag 3
plot for [i=1:words(file_list)] 'word(file_list,i)' using 16:7 pt 7 ps 1 title word(title_list,i)
gnuplot> file_list = ['cpu001.csv', 'cpu003.csv', 'cpu005.csv', 'cpu007.csv']
                     ^
         line 0: invalid expression
gnuplot> title_list = ['cpu001', 'cpu003', 'cpu005', 'cpu007']
                      ^
         line 0: invalid expression
         line 0: undefined variable: file_list

编辑:尝试使用Christoph的答案导致:

gnuplot> cpu003.csv
         ^
         line 0: invalid command
gnuplot> cpu005.csv
         ^
         line 0: invalid command
gnuplot> cpu007.csv
         ^
         line 0: invalid command
gnuplot> ""
         ^
         line 0: invalid command
gnuplot> cpu003
         ^
         line 0: invalid command
gnuplot> cpu005
         ^
         line 0: invalid command
gnuplot> cpu007
         ^
         line 0: invalid command
gnuplot> ""
         ^
         line 0: invalid command

其他说明:

  • 最好使用python 2.7及以上版本。即我 尝试使用子进程中的“run”,但2.7版没有 它。
  • CPU的数量可以很高,超过100.少数是 暂时用来测试。
  • 虽然相同的python脚本确实知道之前的CPU掩码 步骤,偏好不是在这里依赖它,因为可能存在 缺少相关.csv文件的其他原因。

问题:如何将文件列表和标题列表字符串从python传递到gnuplot,以便可以绘制它们?
即使是一个整数数组,即上例中的1,3,5,7,也可能足够好,因为文件名和标题可以在gnuplot端重新构建。

2 个答案:

答案 0 :(得分:0)

您必须引用分配给gnuplot变量的字符串,但 not 在绘制时word函数周围有引号

file_list = subprocess.check_output('ls -1 cpu???.csv',shell=True)
title_list = subprocess.check_output('ls -1 cpu???.csv | sed -e \'s/.csv//\'',shell=True)

plot_str = "plot for [i=1:words(file_list)] word(file_list,i) using 16:7 pt 7 ps 1 title word(title_list,i)"

g_plot('file_list = "{0}"'.format(file_list))
g_plot('title_list = "{0}"'.format(title_list))
g_plot.__call__(plot_str)

答案 1 :(得分:0)

第一种方法的问题是仍然包含换行符,因此大约将其传递给gnuplot:

file_list = cpu001.csv
cpu003.csv
cpu005.csv
cpu007.csv

所以gnuplot抱怨它认为是命令的3个后续行。 (类似于第二个字符串)。

第二种方法的问题在于我认为从.splitlines()操作返回的字符串格式相当奇怪。所以gnuplot抱怨,因为它不明白传递给它的是什么。

由于希望将一个漂亮的干净字符串传递给gnuplot,因此挑战是找到一个可以执行此操作的函数。 .replace('\n', ' ')似乎在做这项工作。一个字符串就足够了,因为我们可以使用loop命令的实际绘图轻松地重建完整的文件名。 (另请注意,从循环绘图中的整数迭代器到字符串迭代器的更改):

    title_list = subprocess.check_output('ls -1 cpu???.csv | sed -e \'s/.csv//\'',shell=True).replace('\n', ' ')
    plot_str = "plot for [i in title_list] i.'.csv' using 16:7 pt 7 ps 1 title i"

#debug
    print('flag 2')
    print(title_list)
    print('flag 3')

    g_plot('title_list = "{}"'.format(title_list))
    g_plot(plot_str)