ytics 中的 Gnuplot 多个值

Gnuplot multiple values in ytics

我正在尝试以 .

我的数据文件由两个列组成,每个列都包含 unix 时间戳。

1580342400  1492387200
1583107200  1493856000
1584230400  1494201600
1585267200  1495238400
...

这是我目前所做的:

set term qt
set xlabel "Current Date"
set ylabel "Time to wait in days and years"
set timefmt "%s"
set format x "%d.%m.\n%Y"
set xdata time
set grid

plot 'times.log' \
  u 1:((-)/86400)::yticlabels(sprintf("%d (%.1f)",((-)/86400),((-)/86400/365))) \
  with lp lw 2 lt 4 notitle

产生以下结果:

唯一真正困扰我的是 ytics 不是 等距分布

有什么方法可以得到我想要的格式并仍然保持等距 ytics 吗?

我想到的另一个选择是使用新的 stats 函数和 for 循环 迭代所有数据集并添加一个手动为每个数据集添加标签。

欢迎任何提示,但是,我不是 perl/bash/etc 的忠实粉丝。与 gnuplot 混合,我只想在这种情况下保留它 gnuplot。

一种可能的方法如下:使用 y 轴表示天数,y2 轴表示年数。 你必须link他们,勾选help link。如果您还想要 y 轴左侧的年份,您可以“作弊”,例如set y2tics offset graph -1.105,0。 您必须使用所有偏移量和边距才能获得最佳结果。 我不知道会有一个简单的自动化解决方案,其中包含 set format y "%tD (%tY)" time 之类的东西(实际上,%tY 不是有效的格式说明符)。检查 help format specifiershelp time_specifiers。 请记住,虽然天数是等距的,但年数不会因为舍入误差。

代码:

### days and years at the y-axis
reset session

DateStart = "01.01.2020"
DateEnd   = "01.10.2021"

myTimeFmt = "%d.%m.%Y"
set xrange[strptime(myTimeFmt,DateStart):strptime(myTimeFmt,DateEnd)]

# create some test data
set samples 20
set table $Data
    plot '+' u 1:(*1.07+rand(0)*3*86400) w table
unset table

set lmargin 14
set xlabel "Current date"
set format x "%d.%m.\n%Y" time

set ylabel "Time to wait in days (years)" offset -5,0
set format y "%.0f"
set ytics offset -5,0

set link y2 via y/365.25 inverse y*365.25
set y2tics
set y2tics offset graph -1.105,0
set format y2 "(%0.2f)"
set grid x,y
set key noautotitle

plot $Data u 1:((-)/3600/24) w lp pt 7

### end of code

结果:

加法:

y 轴上的天数和 y2 轴上的年数提供了将 y2tics 步长“独立”设置为偶数的优势,但当然,网格将仅适合 y 轴。此外,您不必 fiddle 使用偏移量。当然,你必须 link 轴(检查 help link)。

关于测试数据,您可以绘制或打印成table,检查help tablehelp set print。和你一样,我更喜欢在 gnuplot 中做所有事情(如果可能的话),但是,有时它可能会变得非常复杂和冗长。 此外,当我 post 关于 SO 的答案时,我总是尝试给出一个“复制和粘贴 & 运行” 的例子。如果我没有足够的 OP 数据,我通常会包含一些类似于 OP 数据的(随机)数据,以获得合理的演示图。在您的情况下,只需跳过这些测试数据行并将 plot 命令中的 $Data 替换为您的文件名,在您的情况下为 'times.log'.

代码:

### days at y-axis and years at y2-axis
reset session

DateStart = "01.01.2020"
DateEnd   = "01.10.2021"

myTimeFmt = "%d.%m.%Y"
set xrange[strptime(myTimeFmt,DateStart):strptime(myTimeFmt,DateEnd)]

# create some test data
set samples 20
set table $Data
    plot '+' u 1:(*1.07+rand(0)*3*86400) w table
unset table

set xlabel "Current date"
set format x "%d.%m.\n%Y" time

set ylabel "Time to wait in days"
set format y "%.0f"
set ytics nomirror

set link y2 via y/365.25 inverse y*365.25
set y2label "Time to wait in years"
set y2tics 0.02
set format y2 "%0.2f"
set grid x,y
set key noautotitle

plot $Data u 1:((-)/3600/24) w lp pt 7
### end of code

结果: