6

我的数据文件有这个内容

# data file for use with gnuplot
# Report 001
# Data as of Tuesday 03-Sep-2013 
total   1976
case1   522 278 146 65  26  7
case2   120 105 15  0   0   0
case3   660 288 202 106 63  1

我正在使用下面的脚本从案例...行制作直方图 - 这很有效。我的问题是:如何从数据文件中加载总计 1976 年(在“总计”一词旁边)并(a)将其存储到变量中或(b)直接在绘图标题中使用它?

这是我的 gnuplot 脚本:

reset
set term png truecolor
set terminal pngcairo size 1024,768 enhanced font 'Segoe UI,10'
set output "output.png"
set style fill solid 1.00
set style histogram rowstacked
set style data histograms
set xlabel "Case"
set ylabel "Frequency"
set boxwidth 0.8
plot for [i=3:7] 'mydata.dat' every ::1 using i:xticlabels(1) with histogram \
notitle, '' every ::1 using 0:2:2 \
with labels \
title "My Title"

为了其他尝试标记直方图的人的利益,在我的数据文件中,案例标签之后的列表示该行上其余值的总和。这些总数显示在每个直方图条的顶部。例如对于 case1,522 是 (278 + 146 + 65 + 26 + 7) 的总和。

我想在图表的某处显示总计,例如标题的第二行或标签。我可以将一个变量放入 sprintf 到标题中,但我还没有想出将“单元格”值(“单元格”表示行列交叉点)加载到变量中的语法。

或者,如果有人可以告诉我如何使用 sum 函数来总计 522+120+660(从数据文件中读取,而不是作为常量!)并将该总计存储在一个变量中,这将避免需要大总在数据文件中,那也会让我很高兴。

非常感谢。

4

2 回答 2

14

让我们从在 (row,col) 处提取单个单元格开始。如果是单个值,可以使用stats命令提取值。row和用andcol指定,就像在绘图命令中一样。在您的情况下,要提取总值,请使用:everyusing

# extract the 'total' cell
stats 'mydata.dat' every ::::0 using 2 nooutput
total = int(STATS_min)

要总结第二列中的所有值,请使用:

stats 'mydata.dat' every ::1 using 2 nooutput
total2 = int(STATS_sum)

最后,总结3:7所有行中列中的所有值(即与上一个命令相同,但不使用保存的总数)使用:

# sum all values from columns 3:7 from all rows
stats 'mydata.dat' every ::1 using (sum[i=3:7] column(i)) nooutput
total3 = int(STATS_sum)

这些命令需要 gnuplot 4.6 才能工作。

因此,您的绘图脚本可能如下所示:

reset
set terminal pngcairo size 1024,768 enhanced
set output "output.png"
set style fill solid 1.00
set style histogram rowstacked
set style data histograms
set xlabel "Case"
set ylabel "Frequency"
set boxwidth 0.8

# extract the 'total' cell
stats 'mydata.dat' every ::::0 using 2 nooutput
total = int(STATS_min)

plot for [i=3:7] 'mydata.dat' every ::1 using i:xtic(1) notitle, \
     '' every ::1 using 0:(s = sum [i=3:7] column(i), s):(sprintf('%d', s)) \
     with labels offset 0,1 title sprintf('total %d', total)

给出以下输出:

在此处输入图像描述

于 2013-09-03T08:15:40.207 回答
2

For linux and similar.

If you don't know the row number where your data is located, but you know it is in the n-th column of a row where the value of the m-th column is x, you can define a function

get_data(m,x,n,filename)=system('awk "\$'.m.'==\"'.x.'\"{print \$'.n.'}" '.filename)

and then use it, for example, as

y = get_data(1,"case2",4,"datafile.txt")

using data provided by user424855

print y

should return 15

于 2014-05-28T01:07:18.990 回答