使用 gnuplot 同时绘制目录中的所有文件?

Plot all files in a directory simultanously with gnuplot?

我想做类似这个问题的事情:gnuplot : plotting data from multiple input files in a single graph

我想同时绘制 所有 目录中的文件,而不必明确写下它们的名称。所有文件的列号都相同。我能做什么?

plot for [file in *] file u 3:2 没有用。

此外,我不希望每个文件都有不同的图例。来自所有文件的所有点都应该被同等对待,就像它们都来自一个文件一样。

您可以尝试类似的方法:

a=system('a=`tempfile`;cat *.dat > $a;echo "$a"')
plot a u 3:2

这使用命令行tempfile 命令来创建一个安全、唯一且一次性的临时文件。它将所有数据文件混合到这个文件中。然后它回显文件名,以便 gnuplot 可以检索它。 Gnuplot 然后绘制东西。

担心 header 行?试试这个:

a=system('a=`tempfile`;cat *.dat | grep "^\s*[0-9]" > $a;echo "$a"')

正则表达式 ^\s*[0-9] 将匹配以任意数量的空格开头后跟数字的所有行。

我也喜欢可以选择要用通配符绘制的文件,所以如果你喜欢的话,你可以按照下面的方法做,尽管有很多方法。创建以下脚本。

script.sh:

gnuplot -p << eof
set term wxt size 1200,900 title 'plots'
set logs
set xlabel 'energy'
plot for [ file in "$@" ] file w l
eof

chmod u+x script.sh

运行 喜欢 ./script.sh dir/* *.dat

如果你需要它,经常给它起一个别名,并把它放在一个合理的地方:) 干杯/J

作为乔纳坦答案的替代方案,我会选择

FILES = system("ls -1 *.dat")
plot for [data in FILES] data u 1:2 w p pt 1 lt rgb 'black' notitle

plot '<(cat *.dat)' u 3:2 title 'your data'

如果您想要标记每条曲线,第一个选项可以为您提供更大的灵活性。例如,如果您有多个名称为 data_1.datdata_2.dat 等的文件,它们将被标记为 12 等,则:

FILES = system("ls -1 data_*.dat")
LABEL = system("ls -1 data_*.dat | sed -e 's/data_//' -e 's/.dat//'")

plot for [i=1:words(FILES)] word(FILES,i) u 3:2 title word(LABEL,i) noenhanced

尝试以下命令:

gnuplot -e 'plot for [file in system("find . -depth 1 -type f -print")] file u 3:2'

注:添加-p以保留情节window。