利用 gnuplot 绘制时间序列图

最后更新于:2022-04-01 07:31:39

大名鼎鼎的 gnuplot 就不多介绍了。 通常我们利用数据文件绘图时,XY坐标的值都是实数,也就是我们要绘制图形的函数是R到R的映射。可有时横轴或纵轴的数据是时间值,时间的格式每次可能还都不太一样。这时我们就需要特殊设置一下 gnuplot了。 假设我们有数据文件“timedat.dat”,文件的内容如下。 ~~~ #日/月/年 值 01/06/93 100 17/08/93 900 04/10/93 1300 11/10/93 300 28/10/93 1000 ~~~ 可以看到,横坐标是时间值,需要将这个信息告诉gnuplot。利用如下的命令。  ~~~ set xdata time ~~~ 类似的命令还包括: ~~~ set ydata time set zdata time set x2data time set y2data time set cbdata time ~~~ 如果要回到原来的那种横坐标为数值的状态,可以执行如下命令: ~~~ set xdata ~~~ 下面还需要告诉 gnuplot 数据文件中的时间格式是什么样,要利用如下的命令 ~~~ set timefmt "<format string>" ~~~ 其中format string 用来描述数据文件中时间的格式。对于我们的数据文件,可以这样设置: ~~~ set timefmt "%d/%m/%y" ~~~ Gnuplot 支持的格式如下: <table align="center"><tbody><tr><td valign="top"><p>格式</p></td><td valign="top"><p>解释</p></td></tr><tr><td valign="top"><p>%d</p></td><td valign="top"><p>day of the month, 1<span style="font-family:宋体">–</span><span style="font-family:Times New Roman">31</span></p></td></tr><tr><td valign="top"><p>%m</p></td><td valign="top"><p>month of the year, 1<span style="font-family:宋体">–</span><span style="font-family:Times New Roman">12 </span></p></td></tr><tr><td valign="top"><p>%y</p></td><td valign="top"><p>year, 0<span style="font-family:宋体">–</span><span style="font-family:Times New Roman">99</span></p></td></tr><tr><td valign="top"><p>%Y</p></td><td valign="top"><p>year, 4-digit</p></td></tr><tr><td valign="top"><p>%j</p></td><td valign="top"><p>day of the year, 1<span style="font-family:宋体">–</span><span style="font-family:Times New Roman">365</span></p></td></tr><tr><td valign="top"><p>%H</p></td><td valign="top"><p>hour, 0<span style="font-family:宋体">–</span><span style="font-family:Times New Roman">24</span></p></td></tr><tr><td valign="top"><p>%M</p></td><td valign="top"><p>minute, 0<span style="font-family:宋体">–</span><span style="font-family:Times New Roman">60</span></p></td></tr><tr><td valign="top"><p>%s </p></td><td valign="top"><p>seconds since the Unix epoch (1970-01-01 00:00 UTC)</p></td></tr><tr><td valign="top"><p>%S</p></td><td valign="top"><p>second, integer 0<span style="font-family:宋体">–</span><span style="font-family:Times New Roman">60 on output, (double) on input</span></p></td></tr><tr><td valign="top"><p>%b</p></td><td valign="top"><p>three-character abbreviation of the name of the month</p></td></tr><tr><td valign="top"><p>%B</p></td><td valign="top"><p>name of the month</p></td></tr></tbody></table>  到这里就设置好了,下面开始显示 ~~~ plot 'timedat.dat' using 1:2 with points ps 3 pt 6 title "" ~~~ 输出的图形如下。   ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-24_56a4234032199.PNG) 可以看到输出的横坐标只有月份和日期,没有年份信息。如果需要加入年份信息,可以这样设置: ~~~ set format x "%y/%m/%d" ~~~ 然后更新一下输出: ~~~ Replot ~~~ ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-24_56a4234042766.PNG) 这时的输出结果就满足我们的需求了。如果需要更细致的设置,请参考 gnuplot 的帮助文件。
';