2013-09-27 80 views
1

在gnuplot中,我试图绘制一个具有5个参数的函数,其值存储在外部文件中,8次图形。我想绘制8种物质的蒸气压作为温度的函数;蒸汽压力由5个变量进行参数化。我曾尝试使用do-for循环,但只绘制了一个物种。如何使用8组参数在同一图上绘制8次函数?下面的代码基于this answer,作品除了给出的答案将打印8个PNG,但我想要1,并修改它,以尝试这样做。在Gnuplot中,如何在for循环中的同一个图上多次绘制函数

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 

回答

3

要绘制多个功能到一个图形,您必须使用只有一个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定义的变量”)。

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

enter image description here

+0

太棒了,谢谢。如果你没有给它一个网格模式来放置不同的地块,我不知道多槽将“追加”地块。 – darthbith

相关问题