如何根据星期几在轴上标记抽动

时间:2019-07-29 15:51:45

标签: gnuplot

我有一些要输入到Gnuplot的数据。数据分为两列,分别是x和y轴的值。第一列(x轴)是整数,代表5分钟间隔-例如从0开始,在5分钟后,整数变为1,依此类推。在第二列(y轴)中,我还有另一个整数。

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

  1. 在我读取文件时,应动态更新绘制的数据。
  2. 我想在x轴上用星期几命名标签tic。命名方案应按星期几顺序移动(假设我从星期五开始绘制数据),相应地循环命名。

我正在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轴上的tic每次都标记为“星期四”。

我终于找到了似乎有用的东西,但是看上去有点难看:

    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

“设置xdtics”是诀窍。至于其余部分,函数定义仅考虑了一天中的288个数据点,即一周中的某天(即mod 7的天数)计算为N-floor(N / 7)* 7-我在这里找不到要使用的模运算符-加5只是表明我在星期五开始收集数据。

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

1 个答案:

答案 0 :(得分:0)

当然可以使用日期格式命令。但是,如果您对连续整数标签能够正确生成感到满意,并且只想将标签更改为日期名称,那么它应该可以使用(gnuplot 5.2):

struct Aderived : public A {
    int a;
    void x();
};

struct Bderived : public B {
    int b;
    void x() { static_cast<Aderived*>(avec.back())->a = 1; }
};

inline void Aderived::x() { static_cast<Bderived*>(b)->b = 1; }

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

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

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

按星期几显示的轴标签,独立于数据点 假设输入的x值以秒为单位,我认为最简单的方法是:

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

不是 不需要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 time 据我了解,由于文件中的x值以5分钟(300秒)为单位,因此您需要在输入时转换为秒。

set timefmt