GNUPLOT 绘制5天财经周的图表

4

我一直在寻找如何从财务图表中删除星期几的方法,但一直没有成功。

我需要图表只包括工作日,完全跳过周末,以便财务图表中没有2天的间隔。

我的数据以CSV格式Open/Low/Close/High存在,其中缺少周末数据,它可以绘制出良好的图表,但我找不到如何不显示周末的方法,任何帮助都将不胜感激。

基本上,我想看到X轴上写着M/T/W/T/F/M/T/W/T/F,而不是M/T/W/T/F/S/S/M等等......

谢谢,

Chris。


3
我认为人们没有理解这个问题。这不是关于如何从数据文件中删除周末的问题,数据文件中没有周末的条目。问题在于,如果将x轴设置为时间模式,gnuplot会为每个日历日在x轴上保留一个点。即使这些日期没有任何条目,它也会在x轴上插入空白处来表示周末。也就是说,gnuplot将x轴视为包含所有日历日的连续时间线。原帖询问如何在x轴上不显示周末对应的空白区域,就像这些日子根本不存在一样。 - MrSparkly
6个回答

1
据我所知,gnuplot本身无法完成此操作 - 您需要在进行操作之前将文件转换为所需的格式。如果您使用Linux,则可以使用类似以下命令的工具来完成此操作:
awk '{if( index( $1, "S" ) == 0 ) print $0 >> "new.dat"}' old.dat

其中old.dat是您的原始文件,new.dat是没有周末的新文件。在这里,我假设您的数据文件每行的第一个条目是工作日。

这也适用于Windows,但您需要先安装Windows版Gawk


0

今天我刚刚接触到set xdtics。虽然我怀疑你可能已经不再处理这个问题了,但也许对其他人有所帮助...(请参阅help xdtics)


0

如果您想在时间轴上忽略周末,您可以简单地定义一个函数,在time(0)之后返回日期编号,省略周末。请注意,对于gnuplot 5.x,time(0)1970-01-01 00:00:00,而对于gnuplot 4.x,则为2000-01-01 00:00:00

  • dw5(t)返回time(0)之后的日期编号,省略周末,并在t为周末时返回NaN
  • dw5tow7(n)返回“5天制”日期编号的日期,并在输入为NaN时返回NaN
  • dw7Tic(n)返回xtic的日期标签,并在输入为NaN时返回空字符串''

例如,以下命令:

do for [i=0:10] { print sprintf("%s % 4d",strftime("%Y-%m-%d",dw5tow7(i)),i) }

在gnuplot5.x中将返回:

1970-01-01    0
1970-01-02    1
1970-01-05    2
1970-01-06    3
1970-01-07    4
1970-01-08    5
1970-01-09    6
1970-01-12    7
1970-01-13    8
1970-01-14    9
1970-01-15   10

脚本:(适用于gnuplot>=5.0.0,2015年1月)

### remove weekends on time scale
reset

FILE = "SO9680677.dat"

# create some random test data
set print FILE
    t0 = time(0)
    y0 = 100
    do for [i=0:60] {
        t  = t0 + i*3600*24
        if (int(tm_wday(t)+1)%7>1) { 
            print sprintf("%s %g",strftime("%Y-%m-%d",t),y0=y0+rand(0)*1-0.5)
        }
    }
set print

SecPerDay    = 3600*24
SecPerWeek   = 7*SecPerDay
isWeekend(t) = int(tm_wday(t)+1)%7 < 2
myTimeFmt    = "%Y\n%m-%d"
tOff         = tm_year(0)==1970 ? 3 : 5     # offset gnuplot5.x: 3, gnuplot4.x: 5
dw5(t)       = isWeekend(t) ? NaN : int(t/SecPerDay) - 2*int((t+tOff*SecPerDay)/SecPerWeek)
dw5tow7(n)   = n==n ? n*SecPerDay + (int(n+tOff)/5)*2*SecPerDay : NaN
dw7Tic(n)    = n==n ?  strftime(myTimeFmt,dw5tow7(n)) : ''

set key top center out noautotitle
set grid x,y
set ytics 1

set multiplot layout 2,1

    set xrange[:] noextend
    set format x myTimeFmt timedate
    plot FILE u (timecolumn(1,"%Y-%m-%d")):2 w lp pt 7 lc rgb "red" ti "with weekends"

    set format x "%g\n" numeric
    plot FILE u (dw5(timecolumn(1,"%Y-%m-%d"))):2 w lp pt 7 lc rgb "web-green" ti "without weekends", \
           '' u (t0=dw5(timecolumn(1,"%Y-%m-%d"))):(NaN):xtic(dw7Tic(t0)) every 5

unset multiplot
### end of script

将上述的multiplot部分替换为下面的片段,脚本将在gnuplot>=4.6.0(2012年3月)上运行。也许通过进一步调整,可以使其适用于gnuplot 4.4.0。
### version for gnuplot 4.6.0, March 2012
set multiplot layout 2,1
    set timefmt "%Y-%m-%d"
    set xdata time
    set format x myTimeFmt
    plot FILE u 1:2 w lp pt 7 lc rgb "red" ti "with weekeends"

    set format x "%g\n"
    plot FILE u (dw5(timecolumn(1))):2 w lp pt 7 lc rgb "web-green" ti "without weekends", \
           '' u (t0=dw5(timecolumn(1))):(NaN):xtic(dw7Tic(t0)) every 5 w p
unset multiplot

结果:

实际上,总的来说,时间范围越大,你就越不会注意到是否有周末。

enter image description here


0

文件中没有显示数据,该文件仅基于工作日并缺少周末。如果绘制数据,则在周末会出现这两天的间隙,因此我想要删除这些间隙。实际上更多是将周末包含在x轴中以使其线性。

以下是文件的部分示例:

2006-03-23T16:59 1.7470 1.7324 1.7471 1.7344 0.0000 0.0000 0.0000 0.0000
2006-03-24T16:59 1.7346 1.7308 1.7441 1.7428 0.0000 0.0000 0.0000 0.0000
2006-03-27T17:59 1.7424 1.7415 1.7492 1.7459 0.0000 0.0000 0.0000 0.0000
2006-03-28T17:59 1.7462 1.7422 1.7537 1.7424 0.0000 0.0000 0.0000 0.0000

如果您查看日期,文件中存在间隔。这是因为这些日期没有数据。然而,图表应该在没有间隔的情况下运行,这就是我试图实现的目标。


一个 hacky 的想法:你可以用行号替换日期/时间字符串,这样你就可以得到没有间隙的图形,并使用适当的文本标签添加丢失的日期信息。 - vaettchen

0
假设您的数据文件没有缺少任何工作日,您可以将日期列视为字符串类型。(如果您缺少工作日,则图表将跳过这些日期而不分配任何空间给它们,这很容易被忽略,所以请注意。)
我的数据文件中第一列是日期,格式为YYYY-MM-DD。我要绘制的数据在第二列中。以下是我的gnuplot配置的相关行:
set format x '%s'
plot 'file' using 0:2:xtic(substr(strcol(1),6,10))

set format 命令告诉gnuplot如何打印x轴标签。 using 配置使用第0列(即索引)作为x参数,第2列(即数据)作为y参数,并提供特殊的打印标签指令:仅打印第6-10个字符。(这将截掉年份部分,有助于标签在我的情况下适合并且不重叠。)

还可以参见此SO答案。 我不想为每个周末复制这个“破折号”解决方案,但它可能会激发灵感。


-1

使用一些外部工具(我会为此编写一个bash或python脚本,我相信这不难),您可以将周末日期的行(每天一行)插入到数据文件中,就像这样:

2006-03-26T00:00 NaN NaN NaN NaN NaN NaN NaN NaN

(或者你可以在数据文件末尾添加那些周末的 NaN 并使用 unique 关键字)

然后绘制,比如说,第一组数据用 using 1:($2) with linespoints,不是 using 1:2 ...

这应该适用于你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接