gnuplot - 如何根据星期几在轴上标记抽动
问题描述
我有一些数据想提供给 Gnuplot。数据分为两列,分别是 x 轴和 y 轴的值。第一列(x 轴)是一个整数,表示五分钟的间隔——例如从 0 开始,5 分钟后整数变为 1,等等。在第二列(y 轴)中,我有另一个整数。
这是一个不断附加的文件——我每 5 分钟阅读一次。我想完成两件事:
- 当我阅读文件时,应该动态更新绘制的数据。
- 我想用星期几的名称在 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 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 time
orset timefmt
由于我理解文件中的 x 值以 5 分钟(300 秒)为单位,因此您需要在输入时转换为秒。
plot "Data" using ($1*300):2
推荐阅读
- javascript - 生成 id 并将它们推送到 Javascript 中的数组中?
- verilog - Verilog 如何使用时钟逐位更改线路?
- c++ - 根据 R 与 rcpp 中的索引选择向量
- ios - 回调 URL 未调用 completionHandler
- vb.net - 使用 webclient 类提取特定链接
- html - 无法显示全屏图像背景
- azure - 在 DownloadBuildArtifact 任务中找不到下载的工件
- python - 如何将列表更改为字典
- html - Angular - (文件)输入在文件选择时不规则
- c - 从文件中读取并将其存储到 c 中长度未知的字符串中