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
我有 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