在gnuplot中,我试图绘制一个具有5个参数的函数,该函数的值存储在一个外部文件中,在同一张图上8次。我想将8种物质的蒸气压与温度作图。蒸汽压力由5个变量设定。我已经尝试过使用do-for
循环,但是只能绘制一个物种。如何使用8组参数在同一图上绘制函数8次?下面的代码基于此答案,并且可以运行,除了给出的答案将打印8 png,但我想设置为1,并对其进行了修改。
parameters.txt
A B C D E
33.634 -3647.9 -8.6428 -9.69E-11 1.19E-06
19.419 -5869.9 -0.4428 -1.26E-02 5.22E-06
-15.077 -4870.2 14.501 -3.16E-02 1.35E-05
76.1 -5030 -25.078 9.76E-03 -2.58E-13
2.1667 -2631.8 4.035 -1.18E-02 6.10E-06
39.917 -4132 -10.78 1.97E-10 2.04E-06
29.89 -3953.5 -7.2253 2.11E-11 8.96E-07
99.109 -7533.3 -32.251 1.05E-02 1.23E-12
vapor.plt
reset
datafile = "parameters.txt"
set terminal pngcairo
set xrange [273.15:493.15]
set logscale y
set output "vapor.png"
do for [step=1:8] {
# read parameters from file, where the first line is the header, thus the +1
a=system("awk '{ if (NR == " . step . "+1) printf \"%f\", $1}' " . datafile)
b=system("awk '{ if (NR == " . step . "+1) printf \"%f\", $2}' " . datafile)
c=system("awk '{ if (NR == " . step . "+1) printf \"%f\", $3}' " . datafile)
d=system("awk '{ if (NR == " . step . "+1) printf \"%f\", $4}' " . datafile)
e=system("awk '{ if (NR == " . step . "+1) printf \"%f\", $5}' " . datafile)
# convert parameters to numeric format
a=a+0.
b=b+0.
c=c+0.
d=d+0.
e=e+0.
plot 10**(a + b/x + c*log10(x) + d*x + e*x**2) title ''
}
set output
要将多个函数绘制到一张图中,您必须仅使用一个plot
命令,并用逗号分隔函数:
plot f(x), g(x), h(x)
这将在一个图中绘制所有三个函数。对于您的情况,您需要首先提取参数,使其具有a1
,,a2
...a8
等。这样做的好处是,您可以为参数集设置一个键(图例)。
第二个选项更适合您现有的脚本。您需要将plot
呼叫放在multiplot
:
reset
datafile = "parameters.txt"
set terminal pngcairo
set xrange [273.15:493.15]
set logscale y
set output "vapor.png"
set lmargin at screen 0.1
set rmargin at screen 0.9
set bmargin at screen 0.1
set tmargin at screen 0.9
set multiplot
do for [step=1:8] {
# read parameters from file, where the first line is the header, thus the +1
a=system("awk '{ if (NR == " . step . "+1) printf \"%f\", $1}' " . datafile)
b=system("awk '{ if (NR == " . step . "+1) printf \"%f\", $2}' " . datafile)
c=system("awk '{ if (NR == " . step . "+1) printf \"%f\", $3}' " . datafile)
d=system("awk '{ if (NR == " . step . "+1) printf \"%f\", $4}' " . datafile)
e=system("awk '{ if (NR == " . step . "+1) printf \"%f\", $5}' " . datafile)
# convert parameters to numeric format
a=a+0.
b=b+0.
c=c+0.
d=d+0.
e=e+0.
plot 10**(a + b/x + c*log10(x) + d*x + e*x**2) lt step title ''
if (step == 1) {
unset border
unset xtics
unset ytics
}
}
unset multiplot
set output
multiplot
每次使用边框和抽签时都会重绘,这看起来很丑陋(粗略)。为此,我在第一个绘图后未设置边框,xtics和ytics。但是为了使所有图都有相同的边距,我在开始时设置了固定的绝对边距。可以保留自动边距,该边距是使用第一个图计算的,但是这有点冗长(请参阅文档中的“ Gnuplot定义的变量”主题)。
对于每个图,我还使用了不同的线型。上面的脚本给出了输出:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句