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
我不知道原因,但通过这样做它起作用了。
我的情况是:
我有一个 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
我不知道原因,但通过这样做它起作用了。