我想通过仅输入x并从数据点计算y来在图形中某个x位置处手动添加标签。
例如:
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。)
答案 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_x
和data_y
。表达式(data_x[1+$0]=$1,data_y[1+$0]=$2,$1):2
基本上对1:2
数据中的每一行求值。但是,由于comma operator,它具有设置data_x
和data_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