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