在gnuplot中循环绘图

时间:2015-09-23 12:15:52

标签: loops gnuplot

我试图在gnuplot的循环中绘制大约105个文件。 这就是我在终端中输入的内容。

i=0.0
n=0.052
set terminal jpeg 
load "plot.plt" 

这是我在plot.plt

中的内容
filename = "mean_230_1.6_A".i.".dat"
plotfile = "mean_230_1.6_A".i."jpg"
print filename." ".plotfile
set output plotfile
plot "PSD_230.dat" u 2:3 w lines , filename using 1:2:3 w yerr pt 7
set output
i=i+0.0005
if (i <= n) reread 
然而,然后我执行命令。我收到这个错误:

  

&#34; plot.plt&#34;,第1行:内部错误:STRING运算符应用于非STRING类型

我不知道该怎么做。我之前使用过类似的代码,但它确实有效。

2 个答案:

答案 0 :(得分:1)

我猜你是否遇到了将i(float)与字符串连接的问题?

尝试sprintf("myfilename_%f.jpg", i)创建文件名。

答案 1 :(得分:0)

我会尝试使用for循环:

set terminal jpeg
files  = system("ls mean*.dat")                          #stores all filenames
output = system("ls mean*.dat | sed -e 's/.dat/.jpg/'")  #stores all outputs

do for [i=1:words(files)]{
   filename = word(files,i)     #select filename number i
   plotfile = word(output,i)    #select corresponding output
   print filename." ".plotfile

   set output plotfile
   plot "PSD_230.dat" u 2:3 w lines , filename using 1:2:3 w yerr pt 7
   set output
}

如果您的任何文件名包含空格,请将system函数更改为:

files  = system("ls mean*.dat | xargs -I line echo \\\"line\\\" ")
output = system("ls mean*.dat | sed -e 's/.dat/.jpg/'" | xargs -I line echo \\\"line\\\" ")

关于您获得的错误,您应该使用@ allo的答案,但如果文件名的小数位数不同,则效率不高:

i=0.0005
plotfile = sprintf("mean_%f.jpg", i)      # 6 decimals: mean_0.000500.jpg
plotfile = sprintf("mean_%.4f.jpg", i)    # 4 decimals: mean_0.0005.jpg

i=0.001
plotfile = sprintf("mean_%.4f.jpg", i)    # 4 decimals: mean_0.0010.jpg
plotfile = sprintf("mean_%.3f.jpg", i)    # 3 decimals: mean_0.001.jpg

我认为,如果文件名中的数字小数为4或更少,则最好使用%g而不是%f格式说明符:

sprintf("mean_%g.jpg", 1)         # 0 decimals: mean_1.jpg
sprintf("mean_%g.jpg", 0.01)      # 2 decimals: mean_0.01.jpg
sprintf("mean_%g.jpg", 0.0001)    # 4 decimals: mean_0.0001.jpg
sprintf("mean_%g.jpg", 0.00001)   # 5 decimals, unwanted result: mean_1e-05.jpg