首页 > 解决方案 > 如何根据星期几在轴上标记抽动

问题描述

我有一些数据想提供给 Gnuplot。数据分为两列,分别是 x 轴和 y 轴的值。第一列(x 轴)是一个整数,表示五分钟的间隔——例如从 0 开始,5 分钟后整数变为 1,等等。在第二列(y 轴)中,我有另一个整数。

这是一个不断附加的文件——我每 5 分钟阅读一次。我想完成两件事:

  1. 当我阅读文件时,应该动态更新绘制的数据。
  2. 我想用星期几的名称在 x 轴上标记抽动。命名方案应按顺序在一周中的几天内移动(假设我在星期五开始绘制数据)相应地循环名称。

我在 Linux (Slackware 14.2)、Gnuplot 5.0 补丁级别 3 下运行它。

我目前有以下 Gnuplot 代码:

    set terminal x11 size 1900, 800
    set term x11 1 noraise
    set xlabel "Days"
    set grid
    set xtics 1
    set ytics 1
    set yrange [0:40]
    set y2tics 1
    plot "Data1" using ($1/288):2 title "First Data Set" with lines, "Data2" using ($1/288):2 title "Second Data Set" with lines
    pause 60
    reread

上面的代码运行良好,因为它每天(即 288 个 5 分钟间隔)打印出我的带有 tic 的数据,并将每个 tic 标记为一个连续的整数。我想改变这一点,以便这些标签是一周中的几天,从星期五开始。

我试过玩'set xdata'、'set timefmt'等,但我显然误解了如何使用它们。例如,我尝试了以下操作:

    set terminal x11 size 1900, 800
    set term x11 1 noraise
    set grid
    set xdata time
    set timefmt "%s"
    set format x "%A"
    set xtics 288
    set ytics 1
    set yrange [0:40]
    set y2tics 1
    plot "Data1" using 1:2 title "First Data Set" with lines, "Data2" using 1:2 title "Second Data Set" with lines
    pause 60
    reread

这可以绘制和更新数据集,但是 x 轴上的抽动每次都标记为“星期四”。

我终于找到了一些似乎可行,但看起来有点难看的东西:

    set terminal x11 size 1900, 800
    set term x11 1 noraise
    set grid
    set xdtics
    set ytics 1
    set yrange [0:40]
    set y2tics 1
    f(x) = x/288 - (floor(x/288)/7)*7 + 5
    plot "Data1" using (f($1)):2 title "First Data Set" with lines, "Data2" using (f($1)):2 title "Second Data Set" with lines
    pause 60
    reread

'set xdtics' 是诀窍。至于其余部分,函数定义仅考虑了 288 个数据点构成一天,即一周中的天数,即 mod 7 的天数,计算为 N - floor(N/7)* 7 - 我找不到要在此处使用的模数运算符 - 添加的 5 仅表示我在星期五开始收集数据。

当然,这可以更优雅地完成,但这是我能想到的最好的。

标签: gnuplot

解决方案


当然可以为此使用日期格式化命令。但是,如果您很高兴顺序整数标签正在正确生成并且只想将标签更改为日期名称,那么它应该可以使用(gnuplot 5.2):

Array Day = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
label(x) = Day[ int(x/288. + 4) % 7 + 1]

plot "Data1" using ($1/288):2:xticlabel(label($1)) title "First Data Set" with lines, \
     "Data2" using ($1/288):2 title "Second Data Set" with lines

如果您的 gnuplot 太旧而无法支持数组,您可以改用(gnuplot 5.0):

Week = "Monday Tuesday Wednesday Thursday Friday Saturday Sunday"
label(x) = word(Week, (int(x/288. + 4) % 7) + 1)

plot "Data1" using ($1/288):2:xticlabel(label($1)) title "First Data Set" with lines, \
     "Data2" using ($1/288):2 title "Second Data Set" with lines

label 函数中额外的“+1”是因为 gnuplot 中的数组和字符串都从 1 开始对元素进行编号。

按星期几的轴标签与数据点无关 假设输入 x 值以秒为单位,我认为最简单的方法是:

set xtics time format "%A"      # Name of day
set xtics 60. * 60. * 24.       # One tic per day
set xtics rotate by -45         # avoid crowding
plot "Data" using 1:2

不需要set xdata timeorset timefmt 由于我理解文件中的 x 值以 5 分钟(300 秒)为单位,因此您需要在输入时转换为秒。

plot "Data" using ($1*300):2

推荐阅读