在 x 轴上具有个性化间隔的 Gnuplot 条形图

Gnuplot bar chart with personalize interval on x-axis

我是 gnuplot 的新手,我想复制这个图:https://images.app.goo.gl/DqygL2gfk3jZ7jsK6

我有一个 file.dat,其连续值介于 0 和 100 之间,我想绘制它,按间隔细分(pident> 98、90 < pident < 100 ...)等。在 y -轴总出现次数。

我到处寻找方法,但我还是做不到。

谢谢! 数据样本,包含值和计数:

33.18 5
43.296 1
33.19 1
27.168 5
71.429 11
30.698 9
47.934 1
43.299 3
30.699 3
37.092 2
24.492 2
24.493 2
24.494 7
47.938 1
24.497 1
37.097 8
37.099 2
33.824 7
51.111 15
59.025 2
62.553 2
62.554 2
57.867 2
33.826 2
62.555 1
33.827 5
62.556 2
33.828 1
59.028 1
46.429 11
51.117 1
75.158 2
27.621 1
27.623 1
27.624 2
37.5 113
37.6 2
32.313 8
27.626 3
37.7 3
32.314 1
67.797 3
27.628 2
32.316 2
37.9 1
61.044 1
43.81 5
32.317 8
32.318 2
43.82 4
32.319 2
43.83 2
37.551 3
61.048 1
48.993 6
29.43 2

这是到目前为止尝试过的代码(我也计算平均值):

#!/usr/bin/gnuplot -persist
set noytics

# Find the mean
mean= system("awk '{sum+=*; tot+=} END{print sum/tot}' hist.dat")

set arrow 1 from mean,0 to mean, graph 1 nohead ls 1 lc rgb "blue"
set label 1 sprintf(" Mean: %s", mean) at mean, screen 0.1

# Histogram
binwidth=10
bin(x,width)=width*floor(x/width)
plot 'hist.dat' using (bin(,binwidth)):(1.0) smooth freq with boxes

这是结果:

以下脚本获取您的数据并对定义的 bin 中的第二列求和。 如果第一列中的值等于 100,则这些值将在 bin 100-<110.

使用 Bin(x) = floor(x/BinWidth)*BinWidth + BinWidth*0.5,将 bin 移动半个 binwidth,让 x 轴上的框从 bin 的开头到 bin 的结尾(而不是在 bin 的开头居中)各自的垃圾箱)。

如果您明确想要 xtics 标签,就像您显示的示例图中那样,即 10-<2020-<30 等,您将不得不 fiddle 使用 xtic标签。

编辑:忘记了平均值。不需要调用 awk。 Gnuplot 也可以为您做这件事,检查 help stats.

代码:

### create histogram
reset session

$Data <<EOD
33.18 5
43.296 1
33.19 1
27.168 5
71.429 11
30.698 9
47.934 1
43.299 3
30.699 3
37.092 2
24.492 2
24.493 2
24.494 7
47.938 1
24.497 1
37.097 8
37.099 2
33.824 7
51.111 15
59.025 2
62.553 2
62.554 2
57.867 2
33.826 2
62.555 1
33.827 5
62.556 2
33.828 1
59.028 1
46.429 11
51.117 1
75.158 2
27.621 1
27.623 1
27.624 2
37.5 113
37.6 2
32.313 8
27.626 3
37.7 3
32.314 1
67.797 3
27.628 2
32.316 2
37.9 1
61.044 1
43.81 5
32.317 8
32.318 2
43.82 4
32.319 2
43.83 2
37.551 3
61.048 1
48.993 6
29.43 2
EOD

# Histogram
BinWidth = 10
Bin(x)   = floor(x/BinWidth)*BinWidth + BinWidth*0.5

# Mean
stats $Data u (*):2 nooutput
mean = STATS_sum_x/STATS_sum_y
set arrow 1 from mean, graph 0 to mean, graph 1 nohead lw 2 lc rgb "red" front
set label 1 sprintf("Mean: %.1f", mean) at mean, graph 1 offset 1,-0.7

set xlabel "Identity / %"
set xrange [0:100]
set xtics 10 out
set ylabel "The number of blast hits"
set style fill solid 0.3
set boxwidth BinWidth
set key noautotitle
set grid x,y

plot $Data using (Bin()):2 smooth freq with boxes lc "blue"
### end of code

结果: