Gnuplot:x轴上的多个标签

Gnuplot:x轴上的多个标签,gnuplot,Gnuplot,我试图绘制以下数据 29.07.2012 18:45:04;23.6;54 29.07.2012 18:50:04;22.7;56 29.07.2012 18:55:04;22.2;56 29.07.2012 19:00:04;22.0;56 29.07.2012 19:05:04;21.9;57 29.07.2012 19:10:04;21.8;56 29.07.2012 19:15:04;21.8;54 29.07.2012 19:20:04;21.7;53 29.07.2012 19:25

我试图绘制以下数据

29.07.2012 18:45:04;23.6;54
29.07.2012 18:50:04;22.7;56
29.07.2012 18:55:04;22.2;56
29.07.2012 19:00:04;22.0;56
29.07.2012 19:05:04;21.9;57
29.07.2012 19:10:04;21.8;56
29.07.2012 19:15:04;21.8;54
29.07.2012 19:20:04;21.7;53
29.07.2012 19:25:04;21.7;53
(日期、时间、温度、湿度)采用以下样式(顶部裁剪):

x轴上的标签是从一天中的时间算起的小时,下面是工作日和日期。我的数据文件中没有工作日,但我希望日期低于小时

我的打印文件:

set datafile separator ";"
set terminal png size 5280,1024
set output '~/tfd.png'
set xdata time
set timefmt "%d.%m.%Y %H:%M:%S"
set format x "%H"
plot "data.csv" using 1:2 title 'temperatur'

我可以想出三种方法来做到这一点。如果您不必将这些日期放在同一个轴上,那么第二种方法可能是最稳定的。第一种和第三种方法各有优缺点。在这两者之间,第三种可能是更好的方法,但它需要更多的工作

对于这些示例,为了确保数据的跨度超过1天,我使用了相同的数据,但增加了一行

31.07.2012 19:30:04;22.7;53
这三种方法都适用于5.0版

在版本4.6中,方法1没有正确对齐,但可以使用一个额外的命令将其设置为

方法2应适用于任何合理的最新版本

由于迭代中的溢出错误,方法3不会在版本4.6中放置所有日期标签(请参阅以获得一些解释),但是可以通过更改迭代来放置标签来使其工作

方法1-多点法

我们可以通过使用multiplot将同一个图叠加在其自身上,并每次对x轴进行不同的处理来实现这一点

set datafile separator ";"
set xdata time
set timefmt "%d.%m.%Y %H:%M:%S"

# Increase bottom margin to allow room for dates
set bmargin at screen 0.1

set multiplot layout 1,1
    # tics starting at 0 every 6 hours showing hour
    set xtics 0,60*60*6 format "%H"
    plot "data.csv" using 1:2 with lines t "Temperature"

    # Tics starting at 0 every 24 hours showing day.month
    # moved down by 1 character to be under hours
    set xtics 0,60*60*24 format "%d.%m" offset 0,-1
    set origin 0,0 # This is not needed in version 5.0
    replot
unset multiplot

除了轴标签上的差异之外,绘图必须相同,以避免它们不对齐,并且这确实会导致y轴标签在书写时稍微加粗

在5.0版中,不需要
设置原点
命令,但在4.6版中需要该命令

方法2-次轴

如果使用次轴是可以接受的,您也可以这样接近它。例如,如果一天显示在x2轴上,小时显示在x1轴上,我们可以这样做

set datafile separator ";"
set xdata time
set x2data time
set timefmt "%d.%m.%Y %H:%M:%S"
set xtics 0,60*60*6 format "%H"
set x2tics 0,60*60*24 format "%d.%m"
plot "data.csv" using 1:2 with lines t "Temperature"

这消除了multiplot方法的一些问题,但会导致两个数据标签位于不同的轴上

方法3-设置手动标签

最后,我们可以手动设置标签。幸运的是,我们可以在最新版本的gnuplot中使用循环,因此我们不必为它发出单独的命令,但我们必须自己计算标签

我们可以使用stats命令来计算标签。如果我们给它时间数据,stats命令会抱怨,因此我们必须在设置时间模式之前使用它,并且我们必须做一些计算日边界的工作。为了确保我们工作在每天的开始,而不是在中间的某个时间,我们将日期解析为内部表示(从UNIX历元以来的秒),并舍入到最近的86400倍(一天中的秒数)。 总而言之,我们能做到

# in-large margin for date labels
set bmargin at screen 0.1
set datafile separator ";"

# Get first and last day in data file as STATS_min and STATS_max
stats "data.csv" u (floor(strptime("%d.%m.%Y %H:%M:%S",stringcolumn(1))/86400)*86400) nooutput

set xdata time
set timefmt "%d.%m.%Y %H:%M:%S"

set for [i=STATS_min:(STATS_max+86400):86400] label strftime("%d.%m",i) at i,graph 0 center offset 0,char -2

# set xtics every 6 hours
set xtics 0,60*60*6 format "%H"
plot "data.csv" using 1:2 with lines t "Temperature"

如果以后需要删除标签,我们可以通过对标签进行编号来改进这一点(
(i-STATS\u min)/86400+1
将对标签进行编号1、2、3等)。请注意,与第一种方法一样,我们需要增加底部的边距大小。我在标签上额外增加了一天,以涵盖gnuplot在x轴上可能进行的四舍五入操作

版本4.6中存在一个处理迭代和整数溢出的错误。要在4.6中使用此解决方案,请更改

set for [i=STATS_min:(STATS_max+86400):86400] label strftime("%d.%m",i) at i,graph 0 center offset 0,char -2


我无法使用终端png或pngcairo使用gnuplot 4.6 patchlevel 0(Debian wheezy)复制您的输出。你使用什么版本和终端?更正:我可以用pngcairo复制方法2!谢谢。我可以确认这三个都与png终端(我认为来自libpng)和pngcairo终端一起工作。我在Windows7上使用版本5。你是对的,方法1和3似乎不适用于4.6。我已经编辑了方法1和3,现在它们适用于4.6版。
days = (STATS_max-STATS_min)/86400+1
set for [i=0:days] label strftime("%d.%m",i*86400+STATS_min) at (i*86400+STATS_min),graph 0 center offset 0,char -2