从x计算单个标签的y

时间:2018-07-30 11:22:18

标签: gnuplot

我想通过仅输入x并从数据点计算y来在图形中某个x位置处手动添加标签。

例如:

graph

 1    set terminal png
 2    set output 'test2.png'
 3    
 4    x = 3
 5    y = 33
 6    set label "test" at x,y
 7    
 8    plot '-' using 1:2 with lines
 9      1 11
10      2 22
11      3 33
12      4 22
13      5 33

因此,我不想在第5行中对“ 33”进行硬编码。

有可能吗?


(我用Google搜索这个问题,并在输入标题后检查了Stackoverflow提供的重复项。Nada。)

2 个答案:

答案 0 :(得分:1)

方法1(数据扫描)

对于不太大的输入,可以将x / y数据加载到两个单独的数组中,然后找到与给定x值相对应的y值:

$DATA <<EOD
1 11
2 22
3 33
4 22
5 33
EOD

stat $DATA nooutput
N = STATS_records

array data_x[N]
array data_y[N]
stat $DATA u (data_x[1+$0]=$1,data_y[1+$0]=$2,$1):2 nooutput

x0 = 3
y0 = NaN
do for [i=1:N] {
  if (data_x[i] == x0) {
    y0 = data_y[i]
  }
}

set label "test" at x0,y0

plot $DATA using 1:2 with lines t ''

这里的技巧是第二个stat命令,该命令仅用于填充数组data_xdata_y。表达式(data_x[1+$0]=$1,data_y[1+$0]=$2,$1):2基本上对1:2数据中的每一行求值。但是,由于comma operator,它具有设置data_xdata_y的相应元素的副作用。

方法2(拟合)

作为一种近似替代方法,可以将以x0 = 3为中心的狭窄高斯拟合到输入数据集。如果此高斯的特征宽度sigma小于数据点之间的特征间隔,则振幅应与输入的y值匹配:

$DATA <<EOD
1 11
2 22
3 33
4 22
5 33
EOD

x0 = 3
sigma = 0.1

f(x) = a*exp(-(x - x0)**2 / (2*sigma**2))
fit f(x) $DATA using 1:2 via a
print a

y0 = a

set label "test" at x0,y0
plot $DATA using 1:2 with lines t ''

方法3(外部工具)

作为一种更强大的替代方法,可以将此任务委托给通过system调用在Gnuplot中调用的外部实用程序。该示例使用gawk扫描输入数据文件。如果在第一列中找到匹配的值,则会打印相应的y值并退出(这样就只报告第一次出现的情况):

inputFileName = 'data.txt'

x0 = 3

getY(fName, x) = system(sprintf("gawk '$1==%d{print $2;exit}' '%s'", x, fName))

y0 = getY(inputFileName, 3)

set label "test" at x0,y0
plot inputFileName using 1:2 with lines t ''

答案 1 :(得分:1)

您说“手动”,那么也许可以选择交互式放置?鼠标单击所需的位置将加载变量MOUSE_X和MOUSE_Y,然后可将其用于生成标签。发行版中有一个演示“ mouselabels.dem”可以自动执行该演示,可能会提供很多信息,但是从本质上讲,您会这样做

plot FOO      # initial plot with no labels
pause mouse   # wait for mouse click
set label 1 "test" at MOUSE_X, MOUSE_Y
replot        # same plot with a label at the requested position