前言
这里只是简单介绍一下 gnuplot 的一些基础概念,以能画出一个 graph 来作为胜利条件。适用于没听说过 gnuplot 的玩家。如果你是想对 gnuplot 有更深的了解的话,你来错地了。
大纲
- 数据源结构
- 更改 X 轴显示时间
- 输出为 png 图片
正文
环境
我是在 linux 上用的 gnuplot, 直接从软件仓库拉下来的。如果在用 ssh 连接到 Linux 然后从用 cli 来调教 gnuplot 时遇到了连接不上 display 的报错,在 sshd 里把 X11-Forward
改成 no.
数据
为了方便解释,下面是我们要用到的 dummy 数据,其保存在文件 data
中。其格式为 [国家名] [日期] [数据]
数据之间的空格表示他们不是一列的。为什么有奇怪的空格,我会在后面解释。我们的目标是把 cases 画到 y 轴,x 轴是对应的时间。不同的国家用不同颜色的线表示出来。
Bulgaria 07/03/2020 0
Bulgaria 08/03/2020 0
Bulgaria 09/03/2020 1
Bulgaria 10/03/2020 1
France 07/03/2020 2
France 08/03/2020 5
France 09/03/2020 10
France 10/03/2020 10
配置
- 这是从 gnuplot 的 demos 里面抄的。会绘制一个平面直角坐标系。字体用 Clear Sans,字号 16.
set terminal pdfcairo transparent enhanced font "Clear Sans, 16" linewidth 2 rounded dashed
set grid layerdefault lt 0 linecolor 0 linewidth 0.500, lt 0 linecolor 0 linewidth 0.500
set key bmargin center horizontal autotitle columnhead nobox
set xtics nomirror rotate autojustify
set ytics nomirror font ",8"
- 配置输出名称并设置格式为 png
set output 'graph.png'
set term png
- 设定图例. 这里用到了 timefmt, 这个是用来规定时间格式的。在 gnuplot 中,始终只能有一种
timefmt
. 如果你的数据里有不同的时间格式的话(比如 DD-MM-YY 和 MM/DD/YYYY),可以在处理完一类时间后重新定义timefmt
来解决。 xrange
用来设定 x 轴的区间format x
允许设定的时间格式和画在图上的时间格式并不一样(比如设定的是 DD-MM-YYYY, 显示为 MM/DD/YY). 对于规定时间格式的代表符,可以参考附录。
set title "Cases by country"
set xlabel "Countries"
set ylabel "Cases"
set xdata time
set timefmt "%d/%m/%Y"
set xrange ["07/03/2020":"10/03/2020"]
set format x "%d/%m/%y"
- 定义两条线,让他们颜色不一样
set style line 1 linecolor rgb '#d32f2f'
set style line 2 linecolor rgb '#afb42b'
- 调用 gnuplot, 传入数据. 这里我们要画两条线, 所以需要两个数据源。这里有两种选择,一种是但源数据文件通过 index 来获取数据,还有一种是多数据文件获取数据。这里使用前者。为了用 index 获取不同国家的数据,每个 data block 之间需要有两个空行。index 从 0 开始。
using
是用来规定 x 轴数据值和 y 轴数据值的。其格式为[列 1]:[列 2]
,列从 1 开始数(第一列为 1,第 2 列为 2)。linestyle
是我们之前设置的线的颜色。title
是这条线的图例。这里不支持从文件中获取,必须为设置好的指。如果需要批量获取,可以用一个 bash 脚本生成 gnuplot 的设置,生成的同时传入这个数据。- 使用
lines
绘制出来的是折线图。如果要画别的图的话,可以参考 gnuplot 的 demo 来改。
plot 'data' index 0 using 2:3 with lines linestyle 1 title "Bulgaria", \
'' index 1 using 2:3 with lines linestyle 2 title "France", \
- 如果用多数据源,一个名为
fr
, 一个名为ba
的话,应该是这样的
plot 'fr' using 2:3 with lines linestyle 1 title "Bulgaria", \
'ba' using 2:3 with lines linestyle 2 title "France", \
- 最后
unset output
附录
时间格式代表符
格式 | 解释 |
---|---|
%a | 星期几的缩写 |
%A | 星期几的全称 |
%b(%h) | 月份的缩写 |
%B | 月份的全称 |
%d | 月里的第一天(1-31) |
%D | “%m/%d/%y” 的缩写 |
%k | 小时(0-23, 1 或 2 位数字) |
%H | 小时(00-23, 2 位数字) |
%l | 小时(1-12, 1 或 2 位数字) |
%I | 小时(01-12, 2 位数字) |
%j | 年里的第几天(1-366) |
%m | 月份(1-12) |
%M | 分钟(0-60) |
%p | “am” 或 “pm” |
%r | “%I:%M:%S %p” 的缩写 |
%R | “%H:%M” 的缩写 |
%U | 年里的第几周(周日为每周第一天) |
%w | 星期几(0-6, 周日为 0) |
%W | 年里的第几周(周一为每周第一天) |
%y | 年(0-99, 1 或 2 位数字) |
%Y | 年 (4 位数字) |
除另有声明外,本博客文章均采用 知识共享(Creative Commons) 署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。