Gnuplot,跳过时间数据,直方图

Gnuplot,跳过时间数据,直方图,gnuplot,histogram,time-format,Gnuplot,Histogram,Time Format,所以,我需要按日期制作数据的柱状图,但我有xticlabel重叠的问题,所以,我试图找到一个解决方案,如何跳过xtics以避免重叠。考虑到日期不是整数,我试图用这种方式解决它: .dat文件 Time Dat 1 Dat 2 1 27-12-2016 12 2 2 28-12-2016 13 7 3 29-12-2016 17 2 4 30-12-2016 9 10 .... 是否可以按第一列计算xtic,但在第二列中显示值而不是在第一列中显示值 我

所以,我需要按日期制作数据的柱状图,但我有xticlabel重叠的问题,所以,我试图找到一个解决方案,如何跳过xtics以避免重叠。考虑到日期不是整数,我试图用这种方式解决它:

.dat文件

Time    Dat 1   Dat 2
1   27-12-2016  12  2
2   28-12-2016  13  7
3   29-12-2016  17  2
4   30-12-2016  9   10
....
是否可以按第一列计算xtic,但在第二列中显示值而不是在第一列中显示值

我的代码:

reset
dx=5.
n=2
total_box_width_relative=0.75
gap_width_relative=0.1
d_width=(gap_width_relative+total_box_width_relative)*dx/2.
d_box = total_box_width_relative/n
reset

set term png truecolor font "arial,10" fontscale 1.0 size 800,400
set output "test.png"
set datafile separator "\\t"
set title "Errors"
set print "-"
set xlabel 'x' offset "0", "-1"
set ylabel 'y' offset "1", "-0"
set key invert reverse Left outside 
set key autotitle columnheader
set key samplen 4 spacing 1 width 0 height 0 
set autoscale yfixmax
set yrange [0: ]
set xtics strftime('%d-%m-%Y', "27-12-2016"), 5, strftime('%m-%d-%Y', "15-01-2017")  
set xtics font ", 7" 
set ytics auto font ", 9" 
set y2tics auto font ", 9"
set grid
set style data histogram
set style histogram cluster gap 1
set style fill transparent solid 0.75 noborder
set boxwidth 0.9 relative
set xtic rotate by -45 scale 0
plot 'datfile' u 3:xtic(strftime('%d-%m-%Y', strptime('%m.%d.%Y', stringcolumn(2)))), '' u 4

在提出这样一个模糊的问题之前,请始终将脚本缩减到再现问题所需的最小值

在删除所有不必要的内容并修复plot命令后,以下是我最终得到的结果:

reset
set datafile separator "\t"
set yrange [0:*]
set style fill transparent solid 0.75 noborder
set boxwidth 0.9 relative
set xtic rotate by -45 scale 0
set key autotitle columnheader

set style data histogram
set style histogram cluster gap 1

plot 'file.dat' using 3:xtic(2) t col(2), '' using 4

在这里,您已经看到了一个通过旋转较长的tic标签来避免重叠的选项

另一种可能是跳过每个第n个xticlabel。此时,您必须了解gnuplot如何创建直方图。直方图不使用传统的数字轴,因此不能像绘制直线时通常使用的那样简单地使用日期。但是gnuplot将每个条形簇放在一个整数x位置,并使用例如
xtic(2)
用第二列中给出的字符串标记每个簇

表达式
xtic(2)
xticlabel(2)
的捷径,意思是
xticlabel(stringcolumn(2))
。在这里,您可以使用生成字符串的任何表达式,包括条件,而不是完全使用第二列中的字符串。要仅每秒打印一次标签,请使用
int($0)%2==0检查行号是否为偶数或奇数,并使用和空字符串或第二列中的字符串:

plot 'file.dat' using 3:xtic(int($0)%2 == 0 ? stringcolumn(2) : '') t col(2), '' u 4

在提出这样一个模糊的问题之前,始终将脚本缩减到再现问题所需的最小值

在删除所有不必要的内容并修复plot命令后,以下是我最终得到的结果:

reset
set datafile separator "\t"
set yrange [0:*]
set style fill transparent solid 0.75 noborder
set boxwidth 0.9 relative
set xtic rotate by -45 scale 0
set key autotitle columnheader

set style data histogram
set style histogram cluster gap 1

plot 'file.dat' using 3:xtic(2) t col(2), '' using 4

在这里,您已经看到了一个通过旋转较长的tic标签来避免重叠的选项

另一种可能是跳过每个第n个xticlabel。此时,您必须了解gnuplot如何创建直方图。直方图不使用传统的数字轴,因此不能像绘制直线时通常使用的那样简单地使用日期。但是gnuplot将每个条形簇放在一个整数x位置,并使用例如
xtic(2)
用第二列中给出的字符串标记每个簇

表达式
xtic(2)
xticlabel(2)
的捷径,意思是
xticlabel(stringcolumn(2))
。在这里,您可以使用生成字符串的任何表达式,包括条件,而不是完全使用第二列中的字符串。要仅每秒打印一次标签,请使用
int($0)%2==0检查行号是否为偶数或奇数,并使用和空字符串或第二列中的字符串:

plot 'file.dat' using 3:xtic(int($0)%2 == 0 ? stringcolumn(2) : '') t col(2), '' u 4

这不应该是对您的另一个问题的编辑吗?简单地
绘制'datfile'u3:xtic(1)
怎么样?然后移除所有你不需要的东西,这些东西应该占所有东西的一半以上lines@Christoph-这就是我要对付的。我想跳过一些带间隔的xlabel。如何做到这一点?Timedat操作适用于框,但他们喜欢从每一列复制每个框,而这正是我不想要的,所以我需要直方图,而不是框。@Christoph顺便说一句,我将它与perl一起使用,将变量放入脚本列表中,并进行一些操作,但它只解决了gnuplot的部分问题。这不应该是对你的另一个问题的编辑吗?简单地
绘制'datfile'u3:xtic(1)
怎么样?然后移除你不需要的东西lines@Christoph-这就是我要对付的。我想跳过一些带间隔的xlabel。如何做到这一点?Timedat操作适用于框,但他们喜欢从每一列重叠每一个框,这是我不想要的,所以我需要直方图,而不是框。@Christoph顺便说一句,我用perl将它将变量放入脚本列表并进行一些操作,但它只解决了gnuplot的部分问题。谢谢你,你救了我的神经。我和这么长时间的争吵。谢谢你,你救了我的神经。我和他斗争了这么长时间。