2016-04-24 41 views
2

我是gnuplot的新手。我有這樣的csv文件:Gnuplot - 根據行上的值繪製csv文件

category| date  | value 
a  |2016-04-01 | 0,2 
a  |2016-04-02 | 0,31 
a  |2016-04-03 | 0,14 
.... 
a  |2016-04-11 | 0,4 
b  |2016-04-01 | 0,32 
b  |2016-04-02 | 0,31 
.... 
b  |2016-04-10 | 0,15 
C  |2016-04-01 | 0,15 
C  |2016-04-02 | 0,23 
..... 

And so on 

如何在一個命令中繪製不同圖形上每個類別的數據?

例如,如果我有9個不同的類別,那麼我有9個圖表,其中x軸表示日期,y軸表示值。

+0

爲什麼R標籤在那裏? – hrbrmstr

+0

這不是一個csv文件。 csv是「逗號分隔值」的縮寫。如果您對格式有任何影響:將小數點分隔符切換爲「。」,並按空格或製表符分隔列。 – Karl

回答

0

我用Perl重新格式化了gnuplot的輸入。

#! /bin/bash 
input=$1 
tmp=$(mktemp) 
perl -aF'/\|/' \ 
    -ne 'print "\n\n" if $last ne $F[0] && $. > 2; 
     $last = $F[0]; 
     $F[-1] =~ s/,/./; 
     print "@F" if $. > 1; 
     ' "$input" > "$tmp" 

categories=($(cut -f1 -d\| "$input" | uniq)) 

{ 
    cat <<EOF 
    set term png; 
    set xdata time; 
    set timefmt '%Y-%m-%d'; 
    plot '$tmp' index 0 using 2:3 with lines title "${categories[1]}" \\ 
EOF 

    i=1 
    while ((i < ${#categories[@]}-1)) ; do 
     printf ', "" index %d using 2:3 with lines title "%s"' $i "${categories[++i]}" 
    done 
} | gnuplot > "$input".png 

rm "$tmp" 
1

您可以使用plot s for循環多次繪製文件。每一次,你只把X值,其中列一​​個符合循環變量(檢查help ternary operator):

set decimalsign "," 
set xdata time 
set format x "%Y-%M-%D" 
plot for [cat in "a b c d"] datafile using ($1 eq cat ? $2 : NaN):3 

的Gnuplot無法連接點(例如with linespoints)是否有無效之間的點。所以你必須對文件進行排序。