GNUPLOT:是否可以循环生成图?

时间:2019-02-01 13:17:13

标签: gnuplot

我有一个.dat文件,看起来像这样

1 1.1
2 1.2
3 1.7
4 0.8
5 0.6
1 1.6
2 0.6
3 0.8
...
...

第一列将循环1 to 5,即标签,第二列将包含我要绘制的数据。

我想为每个plot.png周期绘制不同的1 to 5文件。

对第一个1 to 5说,以下脚本将运行并将png文件保存为plot1.png之类的名称

下一个1 to 5将保存到plot2.png

或者.dat文件可能就是这个

1 1.1
2 1.2
3 1.7
4 0.8
5 0.6
"plot_xyz"
1 1.6
2 0.6
3 0.8
...
...
"plot_zab"

每个周期后跟随要保存的文件名。

这就是我要一套的方法

reset session

set terminal pngcairo enhanced font "Bebas Neue,25" size 1920,1080
set output 'plot.png'

$DATA << EOD
1 0.7 
2 0.6 
3 0.5 
4 0.3 
5 0.9 
EOD

stats $DATA nooutput

N = STATS_columns
M = STATS_records

set angles degrees
do for [i=0:M-1] {
    stats $DATA every ::i::i using (labelValue=$1) nooutput

    if(labelValue==1){
        set label sprintf("Cr") at \
     posX(i,maxR),posY(i,maxR) center offset char posX(i,1),char posY(i,1)
    }
    if(labelValue==2){
        set label sprintf("St") at \
     posX(i,maxR),posY(i,maxR) center offset char posX(i,1),char posY(i,1)
    }
    if(labelValue==3){
        set label sprintf("Bu") at \
     posX(i,maxR),posY(i,maxR) center offset char posX(i,1),char posY(i,1)
    }
    if(labelValue==4){
        set label sprintf("To") at \
     posX(i,maxR),posY(i,maxR) center offset char posX(i,1),char posY(i,1)
    }
    if(labelValue==5){
        set label sprintf("Pr") at \
     posX(i,maxR),posY(i,maxR) center offset char posX(i,1),char posY(i,1)
    }
}
do for [j=1:numOfStepsInR] {
    set label sprintf("%.1f", j*deltaR) at 0,j*deltaR left offset char 0.5,0 tc rgb '#333333'
}

set parametric
set tr [0:1]

set xr [-1.1*maxR:1.1*maxR]
set yr [-1.1*maxR:1.1*maxR]

plot \
     for [i=0:M-1] \
     (cos(alpha(i))*(deltaR*(1-t)+t*maxR)),(sin(alpha(i))*(deltaR*(1-t)+t*maxR)) w l ls 42, \
     for [i=0:M-1] for [j=1:numOfStepsInR] \
     (j*deltaR*cos(alpha(i))*t + (1-t)*j*deltaR*cos(alpha(i+1))),(j*deltaR*sin(alpha(i))*t + (1-t)*j*deltaR*sin(alpha(i+1))) w l ls 42, \
     for [i=2:N] $DATA u (posX($0, column(i))):(posY($0, column(i))) w filledcurves closed fc rgb lcolor(i-2) fs border lc rgb lcolor(i-2) lw 2, \
     for [i=2:N] $DATA u (posX($0, column(i))):(posY($0, column(i))) w p ps 1.2 pt 7 lc rgb lcolor(i-2)

是否可以从.dat文件循环生成图?

2 个答案:

答案 0 :(得分:1)

.dat文件中属于每个图的数据块之间留空行,并使用every关键字选择一个数据块(请参见gnuplot Documentation在第92页)。

答案 1 :(得分:1)

如果您有严格的周期(例如5),则可以使用every,如@jpeg所指出的。 将整个绘图置于do for循环中,并相应地设置输出文件。像这样(简化)。

reset session
set terminal pngcairo 

$DATA << EOD
1 1.1
2 1.2
3 1.7
4 0.8
5 0.6
1 1.6
2 0.6
3 0.8
4 0.8
5 0.6
EOD

stats $DATA nooutput
set parametric

N = STATS_columns
M = STATS_records
C = 5 # Cycle

do for [k=0:floor(M/C)-1] {
    set output sprintf("plot%d.png",k)
    plot \
        for [i=0:M-1] cos(i*t),sin(t),\
        for [i=2:N] $DATA u 1:2 every ::k*C::(k+1)*C-1 w p ps 1.2 pt 7 lc i
}
set output