使用 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.dat
、data_2.dat
等的文件,它们将被标记为 1
、2
等,则:
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。
我想做类似这个问题的事情: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.dat
、data_2.dat
等的文件,它们将被标记为 1
、2
等,则:
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。