2

我目前正在使用脚本来生成直方图,例如,通过执行以下操作:

set style histogram cluster gap 4
plot for [COL=2:10] 'example.dat' u COL:xticlabels(1) title columnheader(COL)

现在我希望在直方图中的条形上方添加 y 值(数字),但添加w labels会给出“没有足够的列用于这种样式”错误。

plot for [COL=2:10] 'example.dat' u COL:xticlabels(1) title columnheader(COL), \
    for [COL=2:10] 'example.dat' u COL title '' w labels

是否可以使用直方图样式添加 y 标签?

注意:我知道有一些绘图示例with boxes。如果可能的话,我希望使用直方图样式来完成这项工作。

4

1 回答 1

9

这是我想出的测试数据文件:

例子.dat

 hi world foo bar baz qux
 1   2     3   4   5   6    
 4   5     7   3   6   5    

这是我用来绘制它的脚本:

set yrange [0:*]
GAPSIZE=4
set style histogram cluster gap 4
STARTCOL=2                 #Start plotting data in this column (2 for your example)
ENDCOL=6                   #Last column of data to plot (10 for your example)
NCOL=ENDCOL-STARTCOL+1     #Number of columns we're plotting 
BOXWIDTH=1./(GAPSIZE+NCOL) #Width of each box.
plot for [COL=STARTCOL:ENDCOL] 'example.dat' u COL:xtic(1) w histogram title columnheader(COL), \
    for [COL=STARTCOL:ENDCOL] 'example.dat' u (column(0)-1+BOXWIDTH*(COL-STARTCOL+GAPSIZE/2+1)-0.5):COL:COL notitle w labels

每个直方图簇在 x 轴上的总宽度为 1 个单位。我们知道我们需要多少宽度(盒子的数量+4,因为那是间隙大小)。我们可以计算每个框的宽度(1/(N+4))。然后我们照常绘制直方图。(请注意,我添加with histogram了 plot 命令)。

根据内置帮助,标签需要 3 列数据 ( x y label)。在这种情况下,y位置和标签相同,可以直接从列中读取COL。第一个块的 x 位置以 0 为中心(总宽度为 1)。因此,第一个块将位于x=-0.5+2*BOXWIDTH。这里的 2 是因为间隙是 4 个框宽——左边两个,右边两个。下一个块将位于-0.5+3*BOXWIDTH等处。通常,(作为 的函数COL)我们可以将其写为

-0.5+BOXSIZE*(COL-STARTCOL+1+GAPSIZE/2)

对于我们读取的每个附加块,我们需要将其向右移动 1 个单位。由于每个块对应于数据文件中的 1 行,因此我们可以为此使用伪列0(即column(0)$0),因为它会随着 gnuplot 读取的每个“记录/行”而递增。第 0 条记录保存标题,第 1 条记录保存第一个块。由于我们想要一个为第一条记录返回 0 的函数,我们使用column(0)-1. 综上所述,我们发现 x 位置为:

(column(0)-1-0.5+BOXSIZE*(COL-STARTCOL+1+GAPSIZE/2))

这相当于我上面的内容。

于 2012-10-17T13:12:18.587 回答