gnuplot 中的直方图与 unix 实用程序中的直方图

histogram in gnuplot vs histogram in unix utilities

我有 csv 文件,我想从第 6 列创建直方图。使用 Linux 实用程序这很简单:

└──> cut -f6 -d, data.csv | sort | uniq -c | sort -k2,2n
    563 0.0
     72 0.025
     35 0.05
     22 0.075
     14 0.1
     21 0.125
     14 0.15
     10 0.175
      5 0.2
      3 0.225
      7 0.25
      3 0.275
      6 0.3
      5 0.325
      3 0.35
      1 0.375
      3 0.4
      1 0.425
      3 0.45
      3 0.475
      5 0.5
      7 0.525
     11 0.55
      3 0.575
      4 0.6
      3 0.625
     11 0.65
      5 0.675
      9 0.7
      5 0.725
      7 0.75
      8 0.775
      5 0.8
      3 0.825
      3 0.85
      4 0.875
      2 0.9
      1 0.925
      1 0.975
    109 1.0

但我想使用 gnuplot 绘制它 我的尝试是修改我找到的 following 脚本。这是我的修改版本:

#!/usr/bin/gnuplot -p
# http://psy.swansea.ac.uk/staff/carter/gnuplot/gnuplot_frequency.htm

clear
reset

set datafile separator ",";
# set term dumb

set key off
set border 3

# Add a vertical dotted line at x=0 to show centre (mean) of distribution.
set yzeroaxis

# Each bar is half the (visual) width of its x-range.
set boxwidth 0.05 absolute
set style fill solid 1.0 noborder

bin_width = 0.1;
bin_number(x) = floor(x/bin_width)
rounded(x) = bin_width * ( bin_number(x) + 0.5 )

# MAKE BINS
# plot dataset_path using (rounded()):(6) smooth frequency with boxes

# DO NOT MAKE BINS
plot "data.csv" using 6:6 smooth frequency with boxes

这是结果:

它说的是与 Unix 工具完全不同的东西。在 gnuplot 中,我见过各种类型的直方图,例如有些遵循正态分布模式,有些则根据频率排序(就好像我用 sort -n 替换了最后一个 sort -k2,2n)另一个根据创建直方图的数字排序(我的情况),等等。如果我可以选择就好了。

smooth frequency 在 x 中呈现单调数据(即第一 using 列中给出的值,在您的情况下是第 6 列中的数值),然后汇总所有 y 值(第二个 using 列中给出的值)。

这里还给了第六列,如果要统计第六列每个不同值出现的次数是错误的,用using 6:(1),即数值1 在第二列中,统计每个值的实际出现次数:

set style fill solid noborder
set boxwidth 0.8 relative
set datafile separator ','
plot 'nupic_out.csv' using 6:(1) smooth frequency with boxes notitle

要对平滑后的数据应用对数刻度,您必须先使用 set table ...; plot 将它们保存到一个临时文件中,然后绘制该临时文件。

set datafile separator ','
set table 'tmp.dat'
plot 'nupic_out.csv' using 6:(1) smooth frequency with lines
unset table

这里你必须注意,因为 gnuplot 中的一个错误在输出文件中添加了错误的最后一行,你必须跳过。您可以通过 using 语句中的过滤器跳过此操作,例如

plot 'tmp.dat' using (strcol(3) eq "i" ?  : 1/0):2 with boxes

在这里工作得很好,或者你可以使用 head

那样剪掉最后两行
plot '< head -n-2 tmp.dat' using 1:2 with boxes

另一点需要注意的是,gnuplot 总是使用空格来写出它的数据文件,所以你必须在绘制 tmp.dat.[=34 之前将数据文件分隔符改回 whitespace =]

完整的工作脚本可以是

set style fill solid noborder
set boxwidth 0.8 relative
set datafile separator ','

set table 'tmp.dat'
plot 'nupic_out.csv' using 6:(1) smooth frequency with lines notitle
unset table

set datafile separator whitespace
set logscale y
set yrange [0.8:*]
set autoscale xfix
plot '< head -n-2 tmp.dat' using 1:2 with boxes notitle

现在,对第六列中的值使用分箱函数,您必须将 using 6:(1) 中的 6 替换为对第六列中给出的值进行运算的函数。此函数必须包含在 () 中,并且您在函数内部使用 </code> 引用第六列中的当前值,例如 </p> <pre><code>plot 'nupic_out.csv' using (bin()):(1) smooth frequency with lines

同样,使用 ChrisW's binning function 的完整工作脚本可能是

set style fill solid noborder
set datafile separator ','

set boxwidth 0.09 absolute
Min = -0.05
Max = 1.05
n = 11.0
width = (Max-Min)/n
bin(x) = width*(floor((x-Min)/width)+0.5) + Min

set table 'tmp.dat'
plot 'nupic_out.csv' using (bin()):(1) smooth frequency with lines notitle
unset table

set datafile separator whitespace
set logscale y
set xrange [-0.05:1.05]
set tics nomirror out
plot '< head -n-2 tmp.dat' using 1:2 with boxes notitle