要求是使用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传递到gnuplot,以便可以绘制它们?
即使是一个整数数组,即上例中的1,3,5,7,也可能足够好,因为文件名和标题可以在gnuplot端重新构建。
答案 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)