bash - 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 函数可以添加日期并可以格式化?
谢谢
解决方案
更新:在查看了更多的 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
推荐阅读
- c++ - Windows 事件查看器中的 APPCRASH -- 应用程序没有崩溃?
- javascript - 为什么我的 React ref 没有安装在 map 函数中?
- java - Android Studio MongoDB javax.naming ConnectionString
- r - 在时间序列中按年份选择值的第一个实例
- javascript - 如何在柏树中重放相同的请求?
- nginx - nginx 将 slug 重写为查询字符串而不更改 url
- ios - 如何使用 AVFoundation 以正确的音高播放不同采样率的音频文件?
- carousel - 在移动设备上,我在 Dreamweaver 中的引导轮播幻灯片默认情况下从左向右滑动
- javascript - 如何确保从服务器导入的号码将导入正确的位置?
- mysql - 让几个“通配符”表达式在 MySQL 中工作时遇到一些麻烦