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
它将相应地绘制。
我有一个 .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
它将相应地绘制。