如何在X轴刻度中有条件地将时间替换为日期?

时间:2016-10-12 11:23:14

标签: gnuplot

我有各种数据集,每个数据集可能跨越多天。数据集在编写时具有未知内容(因为它们来自日志文件),并且要显示的数据范围在任何给定时间都归我的用户所有。

我想要一个类似于下图所示的X轴。时间刻度显示为HH:MM,但更改为标记新一天开始的日期。


(©Advanced Software Engineering Limited - 取自ChartDirector文档)

我不想在每个刻度线上显示DD MM HH:MM,因为that's a waste of space

我已经开始为自动滴答设置HH:MM,然后在每个午夜手动添加额外的DD MM个刻度(标签中带有前导\n)。我也试图利用次要标记:

set format x "%d %b"
set xtics <start>,2592000,<end>

set format x "%H:%M"
set mxtics default

......但这让我没有任何嘀嗒声。此外,理想情况下,我想“请求”GnuPlot为我做这个,而不是硬编码滴答,以便自动缩放可以显示/隐藏滴答,具体取决于可用空间。 (但是,当我从知道绘制数据的开始/结束日期的C ++程序生成GnuPlot脚本时,我确实能够生成具有特定日期/时间的set xtics命令,如果需要的话。)

ChartDirector通过允许我们设置“多标签”来实现这一点,基本上是标签格式取决于条件的标记,例如“这是新一天的第一个标签吗?”。

GnuPlot中有类似的东西吗?解决方案应与GnuPlot 4.4兼容。

1 个答案:

答案 0 :(得分:1)

根据Christoph的评论,下面的剧本应该设定一天而不是午夜抽动的时间。

set xdata time
set format x "%H:%M"

day0 = 1467324000     # 2016-07-01 00:00:00 UTC, first day to be shown.
day0 = day0 + 60*60*2 # 2 hours difference for UTC -> CEST conversion (in my case).
num_days = 2          # Time span to be shown.

pbm_offset_rel = 5e-4      # This is for faking the bold font.
pbm_offset = num_days*24*60*60*pbm_offset_rel

# The default grid every 6 hours, minor tics for the hourly grid.
set xtics 21600 format '%H:%M'
set mxtics 6

# Replace tic labels at midnight.
set for [i=0:num_days] xtics add (strftime('%b %d', day0+i*24*60*60) day0+i*24*60*60)

# We move the midnight labels and corresponding grid lines left and right to make them appear bold.
set xtics add (strftime('%b %d', day0) day0 + pbm_offset)
set for [i=1:num_days] xtics add (strftime('%b %d', day0+(i-1)*24*60*60) day0+(i-1)*24*60*60-pbm_offset)
set xtics add (strftime('%b %d', day0+num_days*24*60*60) day0+num_days*24*60*60-2*pbm_offset)

# Use solid/dotted grid lines for major/minor tics.
set grid xtics, mxtics  ls 1 lc 0, ls 0

set xrange  [day0:day0+num_days*24*60*60]

set terminal png size 1280,480
set output "output.png"
set samples 1200
plot sin(0.00005*x)

在Debian Linux上使用Gnuplot 4.6测试代码。根据{{​​3}},set for语法也适用于Gnuplot 4.4。

Output from the script above