GNUPLOT:可以在循环中生成绘图吗?

GNUPLOT:可以在循环中生成绘图吗?,gnuplot,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到5,这是标签,第二列将有我要绘制的数据 我想为每个1到5周期绘制不同的plot.png文件 例如,对于第一个1到5,以下脚本将运行并将png文件保存到某个名称,如plot1.png 下一步1到5将保存到plot2.png 或者.dat文件可以是 1 1.1 2 1.2 3 1.7 4 0.8 5 0.6 "plot_xyz" 1

我有一个
.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到5,这是标签,第二列将有我要绘制的数据

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

例如,对于第一个
1到5
,以下脚本将运行并将
png
文件保存到某个名称,如
plot1.png

下一步
1到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)
重置会话
设置终端pngcairo增强字体“Bebas Neue,25”尺寸19201080
设置输出“plot.png”

$DATA在
.dat
文件中属于每个绘图的数据块之间留一条空行,并使用
each
关键字选择一个数据块(参见第92页的
gnuplot

如果你有一个严格的循环(例如5),你可以像@jpeg所指出的那样使用
each
。 将整个绘图置于
do for
循环中,并相应地设置输出文件。类似这样的东西(简化)

重置会话
设置终端pngcairo

$DATA谢谢您的建议!所以要选择每个块,我必须执行
every::x::x
。我想我必须把它包装成一个
for
循环。虽然我不确定如何将该块分配给
$DATA
,但您可以使用
every::I::I
生成
I
th图,为
循环选择
I
th数据块。还要小心,我认为您应该为两个
for
循环使用两个不同的变量名(您在这两个循环中都使用了
I
)。这对于第一个图形非常有效,但是对于下一个块,当使用
设置参数化时,我会得到参数化模式下不可用的错误
统计命令。我已经更新了帖子,让它看起来更好。只需将
set parametric
命令放在
stats
命令之后,并在开始时执行
reset session
。如果需要在循环中使用
stats
,只需在
stats
之前直接使用
unset parametric
之后。我不确定我可能做错了什么,因为在我上面的文件中,
set parametric
之后没有
stats
命令。尽管移除循环确实会修复它。或者另一种方法是,仅在
绘图
命令之前直接设置参数化
,然后直接在命令之后设置参数化。
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