2016-04-24 5 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 

Как Plot данные для каждой категории на различных графике в одной команде?

Например, если у меня есть 9 различных категорий, то у меня есть 9 графиков, где ось х - дата, а ось y - значение.

+0

Почему R тег там? – hrbrmstr

+0

Это не файл csv. csv - это аббревиатура для «Comma Separated Values». И если вы имеете какое-либо влияние на формат: переключите десятичный разделитель на «.» И разделите столбцы пробелом или вкладкой. – 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 сек для цикла. Каждый раз, когда вы только рассматривать х значения, где столбец один припадки переменную цикла (проверить 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), если Есть недопустимые точки между ними. Поэтому вам придется отсортировать файл заранее.