0

我正在使用以下代码绘制直方图

set style data histogram
#clustered
#set terminal wxt enhanced persist
set term post eps enhanced "Times-Roman, 14"
set output 'tostack.eps'    #change here
#set boxwidth 0.9 
set grid
set auto y
#set auto x
set auto y
#set ylabel format "{/:Bold}"
#set size 1.35,0.35
#set title ""
set style histogram clustered gap 1 title offset 1,0.25
set ylabel "\nXXX (in %)\n\n" font "Times-Roman ,25"     #change here
set xlabel "\nYYY \n" font "Times-Roman,25"                 #change here
#set style fill solid noborder
set style fill pattern  border -1
set key right
set key spacing 3 font "Times-Roman,20"
set xtics font ", 20"
set ytics font ", 20"

plot for [COL=2:5] 'tostack.dat' using COL:xticlabels(1) title columnheader fs pattern 2

我的数据文件是

AA  BB      CC      DD      EE
100 23.6491500555   6.9743235667    6.5497090218    6.9819639165
200 6.4522741669    14.0817294443   15.1392548608   4.4619875307
300 8.8030456951    8.1386311242    12.5224139497   6.7637627586
400 25.7698157655   7.6673254026    10.0040799765   11.7883595409

在生成的直方图中,我怎样才能只为每组中值较大的条插入标签。

也请帮我把这些标签加粗。

4

1 回答 1

2

为了在每个组中找到最大值,很可能需要使用外部处理工具。例如,可以使用 gawk,如下所示。这个想法是跳过标题(条件NR>1)并在每一行中找到最大的列号(假设您的数据文件有 4 个数据列,这个数字将是 2、3、4 或 5)。现在,在直方图中,各组框连续居中在 0、1、2 等处。有 4 个数据列(并boxwidth设置为 1),每个框的宽度为 0.2(每组两个中心之间的 4 个框 + “空格”的一个空框)。为了找到放置标签的 x 坐标,因此需要将数字2,3,4,5转换为b-0.3,b-0.1,b+0.1,b+0.3,其中 b 表示组的从 0 开始的数字:

set terminal postscript eps enhanced "Times-Roman" 14
set output 'tostack.eps'

set grid

set boxwidth 1.0
set style data histogram
set style histogram clustered gap 1 title offset 1,0.25

set ylabel "XXX (in %)" font "Times-Roman, 25"
set xlabel "YYY" font "Times-Roman, 25"

set style fill pattern border -1
set key right
set key spacing 3 font "Times-Roman, 20"

set xtics font ",20"
set ytics font ",20"

plot \
    for [COL=2:5] 'tostack.dat' using COL:xticlabels(1) title columnheader fs pattern 2, \
    "<gawk 'NR>1{ \
        j=0; \
        for(i=2;i<=NF;i++){ \
            if(i == 2 || $i > m){ \
                m=$i;j=i; \
            } \
        } \
        print (NR-2)+(0.2*j-0.7), m; \
    }' tostack.dat" u 1:2:(sprintf("%.3f", column(2))) t "" w labels offset 0,char 1 font "Times-Bold, 16"

这会产生: 在此处输入图像描述

编辑:如果在每列中选择最大值,只需稍微修改过滤脚本(标签位置计算背后的想法保持不变):

set terminal postscript eps enhanced "Times-Roman" 14
set output 'tostack.eps'

set grid

set boxwidth 1.0
set style data histogram
set style histogram clustered gap 1 title offset 1,0.25

set ylabel "XXX (in %)" font "Times-Roman, 25"
set xlabel "YYY" font "Times-Roman, 25"

set style fill pattern border -1
set key right
set key spacing 3 font "Times-Roman, 20"

set xtics font ",20"
set ytics font ",20"

plot \
    for [COL=2:5] 'tostack.dat' using COL:xticlabels(1) title columnheader fs pattern 2, \
    "<gawk '\
        NR>1{ \
            for(i=2;i<=NF;i++){ \
                if(NR == 2 || $i > m[i-2]){ \
                    m[i-2]=$i; \
                    p[i-2]=NR-2; \
                } \
            } \
        } \
        END{ \
            for(i=0;i<4;i++){ \
                print p[i] + (0.2*i - 0.3), m[i]; \
            } \
        } \
    ' tostack.dat" u 1:2:(sprintf("%.1f", $2)) t "" w labels offset char 0,char 0.5 font "Times-Bold, 12" rotate by 0

产生: 在此处输入图像描述

于 2017-05-15T17:49:50.830 回答