GNUPlot - 在单个图形中绘制多个文件

GNUPlot - Plot multi file in a single graph

我的情况是:

我有一个 csv 文件,名为 LG.0.csv LG.1.csv ...,根据来源,看起来像这样:

Date,Source,counter1,counter2, ...
02/10/2016 09:25:21,LG.1,4.0364,2.8196, ...

这个文件我有很多,我只能有LG.1.csv和LG.3.csv。 我的目标是绘制一个图来比较计数器的值。

我写了一个 bash 脚本来列出目录中存在的文件,然后将它们绘制在一起。

#
DATE=`date +%m-%d-%Y`
counterArray=(c1 c2 c3 c4)
numberOfLG=4
for (( i=0; i<${#counterArray[@]}; i++ ));
do
column=$((i+3))
gnuplot << EOF
 reset
 set terminal png large size 1920,1080
 set output '/plot${counterArray[$i]}.png'
 set datafile separator ","
 set timefmt '%m/%d/%Y %H:%M:%S'
 set xdata time
 set format x "%m/%d/%Y\n%H:%M:%S"

 set title '${counterArray[$i]}'
 set ylabel 'Mbps'
 set yrange [0:*]


plot for [i=0:$numberOfLG] '/home/$USER/Results/$DATE/LG.'.i.'.csv' u 1:$column w lp t 'LG.'.i

EOF
done

如您所见,我使用 for 循环来 运行 每个计数器的绘图(保存在数组中)。 此代码工作正常,但不允许不同数量的文件。

现在我想用它从目录中获取文件名。 fileArray=($(find /home/$USER/Results/$DATE/remote/* -printf "%f\n"))

然后我发现了很多不同的方法,但似乎没有人工作,所以我明白了。

plot for [file in ${fileArray[@]}] '/home/$USER/Results/$DATE/'.${file} u 1:$column w lp t ${file%.*}

我能做到多远?我得到这个错误行 0: undefined variable: LG (对应于 ${fileArray[@]} )

for [a in b],尽管出现,但不是 shell 语法。它期望 b 是单个单词字符串,因此您必须使用单个字符串。考虑这样的事情:

files=$(find /home/$USER/Results/$DATE/remote/ -type f -exec basename -s .csv {} +)

basename -s .csv 将删除路径和 .csv 后缀(如果有)。

然后:

plot for [file in "${files}"] '/home/$USER/Results/$DATE/'.file.'.csv' u 1:$column w lp t file

我明白了:

这很奇怪,但是 files=$(find /home/$USER/Results/$DATE/remote/ -type f -exec basename -s .csv {} +) 不是 gnuplot 的正确数组。所以这是解决方案。

files=$(find /home/$USER/Desktop/test/* -type f -exec basename -s .csv {} +)

ARRAY=()

for file in ${files[@]}
do
ARRAY+=($file)
done

使用另一个数组,所以更新绘图线:

plot for [file in '${ARRAY[@]}'] '/home/$USER/Desktop/test/'.file.'.csv' u 1:3 w lp t file

我不知道原因,但通过这样做它起作用了。