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 specifiers
和 help 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 table
和help 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
结果:
我正在尝试以 天 和 年.
我的数据文件由两个列组成,每个列都包含 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 specifiers
和 help 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 table
和help 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
结果: