Gnuplot - 根据行上的值绘制csv文件

时间:2016-04-24 08:09:39

标签: r csv gnuplot

我是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轴表示值。

2 个答案:

答案 0 :(得分:1)

您可以使用plot 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)。因此,您必须对该文件进行排序。

答案 1 :(得分: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"