前言

这里只是简单介绍一下 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 国际许可协议 进行许可。