2016-09-19 2 views
1

Я пытаюсь построить график и сохранить его как файл с помощью gnuplot. У меня есть различные текстовые файлы. Количество текстовых файлов не является уверенным. Каждый текстовый файл содержит два столбца. Текстовый файл содержит линейный спектр поглощения. Первая колонка - это частота, а вторая - интенсивность. Я хочу сравнить разницу между спектрами, построив их в одном графике для всех файлов. Я использую этот скрипт для этого. сценарий оболочки gnuplot: о различных входных файлах в одном графике для сравнения строк

#!/bin/bash 

# plot linear absorption spectrum (las) 
# Usage: 
# ./lasplot.sh a.ods b.ods c.ods .. 

j=1 
for i in $* 
do 
    echo "Normalization $i" 
    maxle=`cat $i|tr -s "," " "|awk 'BEGIN{max=0} {if($2>max) max=$2}END{print max}'` 
    echo " The max value is $maxle" 
    max[$j]=$maxle 
    filename[$j]=$i 
    ((j=$j + 1)) 
done 
num=$# 
echo ${filename[*]} 
echo $num 

read -p "Please select set data range (1) or auto set(2): " setrange 
case $setrange in 
1) 
    read -p "set min x range: " minx 
    read -p "set max x range: " maxx 
    ;; 
esac 

# call gnuplot to plot the 1D map 
gnuplot << EOF 
set datafile separator "," 
set title 'Linear Absorption Spectra' 
set xlabel '{/Symbol w} (cm^{-1})' 
set ylabel 'Intensity (a.u.)' 

#set data range 
if (${setrange}==1){ 
set xrange [$minx:$maxx] 
set yrange [0:1.1] 
} else { 
#set xrange [0:50] 
#set yrange [0:50] 
} 

set size 1,1 
set key right top 

plot "${filename[1]}" using 1:(column(2)/${max[1]}) with lines linewidth 2 ,\ 
"${filename[2]}" using 1:(column(2)/${max[2]}) with points pointtype 21 

pause mouse keypress "Type a letter" 

set term pdfcairo font "arial,12" 
set term pdfcairo enh 
set term pdfcairo size 6,5 
set output "las.pdf" 
plot "${filename[1]}" using 1:(column(2)/${max[1]}) with lines linewidth 2 ,\ 
"${filename[2]}" using 1:(column(2)/${max[2]}) with points pointtype 21 

EOF 

Мой сценарий может только построить два текстовых файла? Как изменить его для построения нескольких входных файлов?

ответ

0

можно подготовить команду участок в сценарии перед вызовом GNUPLOT, сохранить его в переменной, а затем использовать его на входе GNUPLOT (также избегая, таким образом, повторение):

plotCmd="plot" 
for((i=1;i<=${num};i++)) 
do 
    if [ $i -eq 1 ]; then 
     join=" " 
    else 
     join=", " 
    fi 
    plotCmd="${plotCmd}${join}\"${filename[$i]}\" using 1:2 with lines" 
done 

, а затем:

gnuplot << EOF 

... some other stuff ... 
${plotCmd} 

EOF 
Смежные вопросы