首页 > 解决方案 > gnuplot 中的月份

问题描述

我有一个 csv 文件,其中有 12 个数字,对应于 12 个月。该文件的示例如下:

$ cat data.csv
"3","5","6","5","4","6","7","6","4","4","3","3",

我想使用“一月、二月、三月等”在 x 轴上绘制这些月份。

我找到了这个脚本,但我不知道如何输入月份:

for FILE in data.csv; do
 gnuplot -p << EOF
 set datafile separator ","
 set xlabel "xlabel"
 set ylabel "ylabel"
 set title "graphTitle"
 plot "$FILE" using $xcolumn:$ycolumn
  EOF
done

预期的输出应该是一个图,其中 x 轴是月份,y 轴是 csv 文件中的数据。请注意,CSV 文件中没有月份,只有数字。这就是为什么我要问什么是最好的方法来实现这一点,而不必在 CSV 中手动输入它们或循环遍历数组。是否有任何 gnuplot 函数可以添加日期并可以格式化?

谢谢

标签: bashawkgnuplotpaste

解决方案


更新:在查看了更多的 OP 帖子和代码之后,我猜测所需的格式如下所示:

January:"3",February:"5",March:"6",April:"5",May:"4",June:"6",July:"7",August:"6",September:"4",October:"4",November:"3",December:"3",

如果是这种情况,我们可以使用相同的解决方案(如下)并通过管道将最终结果tr转置回单行/多列数据集,例如:

$ paste -d" " <(locale mon | tr ';' '\n') <(tr ',' '\n' < data.csv) | grep -v '^ $' | tr ' \n' ':,'
January:"3",February:"5",March:"6",April:"5",May:"4",June:"6",July:"7",August:"6",September:"4",October:"4",November:"3",December:"3",

并更新 OPs 代码:

datfile=$(mktemp)
for FILE in data.csv
do
    paste -d" " <(locale mon | tr ';' '\n') <(tr ',' '\n' < data.csv) | grep -v '^ $' | tr ' \n' ':,' > "${datfile}"

    gnuplot -p <<-EOF
    set datafile separator ","
    set xlabel "xlabel"
    set ylabel "ylabel"
    set title "graphTitle"
    plot "${datfile}" using $xcolumn:$ycolumn
    EOF
done
'rm' -rf "${datfile}" > /dev/null 2>&1

看起来gnuplot可以接受各种格式的数据,包括:

January "3"
February "5"
March "6"
April "5"
May "4"
June "6"
July "7"
August "6"
September "4"
October "4"
November "3"
December "3"

注意:如果 OP 确定这不是可接受的文件格式,那么我相信我们可以想出别的东西……只需要用显示月份和数字的有效文件格式样本更新问题。

因此,如果我们可以即时生成此数据集,我们就可以将其提供给gnuplot...

首先,我们将为我们locale生成月份:

$ locale mon
January;February;March;April;May;June;July;August;September;October;November;December

接下来,我们可以将单行/多列数据集转置为多行/单列数据集:

$ locale mon | tr ';' '\n'
January
February
March
April
May
June
July
August
September
October
November
December

$ tr ',' '\n' < data.csv
"3"
"5"
"6"
"5"
"4"
"6"
"7"
"6"
"4"
"4"
"3"
"3"

从这里我们可以paste将这两个数据集放在一起,使用空格作为列分隔符:

$ paste -d" " <(locale mon | tr ';' '\n') <(tr ',' '\n' < data.csv)
January "3"
February "5"
March "6"
April "5"
May "4"
June "6"
July "7"
August "6"
September "4"
October "4"
November "3"
December "3"

最后一步是将其写入(tmp)文件,例如:

$ datfile=$(mktemp)
$ paste -d" " <(locale mon | tr ';' '\n') <(tr ',' '\n' < data.csv) | grep -v '^ $' > "${datfile}"
$ cat "${datfile}"
January "3"
February "5"
March "6"
April "5"
May "4"
June "6"
July "7"
August "6"
September "4"
October "4"
November "3"
December "3"

注意:这grep -v '^ $'是为了摆脱与最后一个逗号(,)相关的额外行data.csv

从这里"${datfile}"可以gnuplot根据需要提供,一旦不再需要删除,例如:

$ gnuplot ... "${datfile}" ...
$ 'rm' -rf "${datfile}" > /dev/null 2>&1

推荐阅读