GnuPlot:基于 header 条目的绘图制表符分隔文件

GnuPlot: plot tab separated file based on header entry

我有一个 .dat 文件,其结构是:

# Solver information
# Time          U_solver        Ux_initial      Ux_final        Ux_iters        Uy_initial      Uy_final        Uy_iters        U_converged     p_rgh_solver    p_rgh_initial   p_rgh_final     p_rgh_iters     p_rgh_converged
1               smoothSolver    1.000000e+00    9.970980e-02    3   1.000000e+00    7.695910e-02    2   false   GAMGPCG 1.000000e+00    1.344030e-03    2   true
2               smoothSolver    4.692880e-01    2.897640e-02    4   3.109600e-01    1.677980e-02    4   false   GAMGPCG 5.659830e-02    7.100450e-05    2   true
3               smoothSolver    3.224570e-01    2.001160e-02    4   1.225150e-01    6.679510e-03    4   false   GAMGPCG 2.845850e-02    1.661910e-05    2   true
4               smoothSolver    2.448820e-01    1.577350e-02    4   6.852310e-02    3.929980e-03    4   false   GAMGPCG 1.871320e-02    1.306270e-05    2   true
5               smoothSolver    1.966380e-01    1.299020e-02    4   4.082900e-02    2.417220e-03    4   false   GAMGPCG 1.366140e-02    8.455600e-06    2   true
6               smoothSolver    1.644830e-01    1.105430e-02    4   2.524760e-02    1.518770e-03    4   false   GAMGPCG 1.051720e-02    5.429050e-06    2   true
7               smoothSolver    1.410070e-01    9.587650e-03    4   1.614980e-02    9.668240e-04    4   false   GAMGPCG 8.530880e-03    3.920410e-06    2   true
8               smoothSolver    1.230200e-01    8.430390e-03    4   1.108410e-02    6.364510e-04    4   false   GAMGPCG 7.317530e-03    3.798000e-06    2   true
9               smoothSolver    1.084740e-01    7.477240e-03    4   8.517250e-03    4.553620e-04    4   false   GAMGPCG 6.441480e-03    3.981460e-06    2   true
10              smoothSolver    9.651470e-02    6.683950e-03    4   7.464690e-03    3.778350e-04    4   false   GAMGPCG 5.702950e-03    3.980550e-06    2   true
11              smoothSolver    8.635920e-02    6.003360e-03    4   7.318430e-03    7.252650e-04    3   false   GAMGPCG 5.075390e-03    3.904680e-06    2   true
12              smoothSolver    7.764280e-02    5.414310e-03    4   7.463720e-03    7.428540e-04    3   false   GAMGPCG 4.520690e-03    3.631550e-06    2   true
13              smoothSolver    7.003640e-02    4.896810e-03    4   7.639310e-03    3.775700e-04    4   false   GAMGPCG 

我想用 gnuplot 绘制每个 name_initial 并保留 header 名称(Ux_initial、Uy_initial 等。 .)

有办法吗?

我没有使用 gnuplot 的经验,所以我被卡住了...

你很幸运,你的数据是用制表符分隔的。将 space 分开,我不会有一个简单的解决方案。 您的数据的特殊之处在于您的标题行已被注释。 gnuplot 中的标准注释字符是 #,因此这些行将被忽略。 你必须:

  • set datafile commentschars "",即没有注释行
  • 跳过一行skip 1
  • 使用 '# Time' 选择列(或者您可以使用数字 1 代替)。
  • set key noenhanced 正确打印图例中的下划线

代码:

### plot commented headerline
reset session

$Data <<EOD
# Solver information
# Time  U_solver    Ux_initial  Ux_final    Ux_iters    Uy_initial  Uy_final    Uy_iters    U_converged p_rgh_solver    p_rgh_initial   p_rgh_final p_rgh_iters p_rgh_converged
1   smoothSolver    1.00E+00    9.97E-02    3   1.00E+00    7.70E-02    2   FALSE   GAMGPCG 1.00E+00    1.34E-03    2   TRUE
2   smoothSolver    4.69E-01    2.90E-02    4   3.11E-01    1.68E-02    4   FALSE   GAMGPCG 5.66E-02    7.10E-05    2   TRUE
3   smoothSolver    3.22E-01    2.00E-02    4   1.23E-01    6.68E-03    4   FALSE   GAMGPCG 2.85E-02    1.66E-05    2   TRUE
4   smoothSolver    2.45E-01    1.58E-02    4   6.85E-02    3.93E-03    4   FALSE   GAMGPCG 1.87E-02    1.31E-05    2   TRUE
5   smoothSolver    1.97E-01    1.30E-02    4   4.08E-02    2.42E-03    4   FALSE   GAMGPCG 1.37E-02    8.46E-06    2   TRUE
6   smoothSolver    1.64E-01    1.11E-02    4   2.52E-02    1.52E-03    4   FALSE   GAMGPCG 1.05E-02    5.43E-06    2   TRUE
7   smoothSolver    1.41E-01    9.59E-03    4   1.61E-02    9.67E-04    4   FALSE   GAMGPCG 8.53E-03    3.92E-06    2   TRUE
8   smoothSolver    1.23E-01    8.43E-03    4   1.11E-02    6.36E-04    4   FALSE   GAMGPCG 7.32E-03    3.80E-06    2   TRUE
9   smoothSolver    1.08E-01    7.48E-03    4   8.52E-03    4.55E-04    4   FALSE   GAMGPCG 6.44E-03    3.98E-06    2   TRUE
10  smoothSolver    9.65E-02    6.68E-03    4   7.46E-03    3.78E-04    4   FALSE   GAMGPCG 5.70E-03    3.98E-06    2   TRUE
11  smoothSolver    8.64E-02    6.00E-03    4   7.32E-03    7.25E-04    3   FALSE   GAMGPCG 5.08E-03    3.90E-06    2   TRUE
12  smoothSolver    7.76E-02    5.41E-03    4   7.46E-03    7.43E-04    3   FALSE   GAMGPCG 4.52E-03    3.63E-06    2   TRUE
EOD

set datafile commentschars ""
set datafile separator tab
set key noenhanced

plot $Data u "# Time":"Ux_initial"    skip 1 w lp pt 7 ti columnheader, \
        '' u "# Time":"Uy_initial"    skip 1 w lp pt 7 ti columnheader, \
        '' u "# Time":"p_rgh_initial" skip 1 w lp pt 7 ti columnheader
        
### end of code

结果:

加法:

下面的内容会更短并且给出相同的结果。

myHeaders = 'Ux_initial Uy_initial p_rgh_initial'

plot for [i=1:words(myHeaders)] $Data u "# Time":word(myHeaders,i) skip 1 w lp pt 7 ti columnheader

可能(不是 100% 确定,让我知道它是否有效),在 Linux 中你可以使用系统命令(检查 help system)或反引号(检查 help backquotes).

myHeaders = system("head myFile.dat | grep -o '[^ ]*_initial[^ ]*'")

plot for [i=1:words(myHeaders)] 'myFile.dat' u "# Time":word(myHeaders,i) skip 1 w lp pt 7 ti columnheader

所以,

我将所有内容都放在一个名为 plotResidual 的可执行文件中。代码是:

filename=

gnuplot -persist <<-EOFMarker
    set datafile commentschars ""
    set datafile separator tab
    set key noenhanced
    set logscale y
    set title 'Residuals'
    set ylabel 'Residual'
    set xlabel 'Iteration'
    myHeaders = system("head $filename | grep -o '[^ ]*_initial[^ ]*'")
    plot for [i=1:words(myHeaders)] '$filename' u "# Time":word(myHeaders,i) skip 1 w l ti columnheader 
EOFMarker

这样用户会调用 plotResidual myFile.dat 它将相应地绘制。