2

在 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
4

1 回答 1

4

要将多个函数绘制到一张图中,您必须只使用一个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 定义的变量”主题)。

我还为每个情节使用了不同的线型。上面的脚本给出了输出:

在此处输入图像描述

于 2013-09-27T19:40:05.063 回答