gnuplot:范围内的最大值和最小值

21

我正在绘制一些具有不同X范围的数据,我想根据当前X范围内数据的最大值和最小值来更改Y范围。当我使用GPVAL_Y_MAX和GPVAL_Y_MIN时,这些值对应于整个数据的最大值和最小值,而不仅仅是范围内的数据。

例如,我有以下数据:

1 3
2 5
3 8
4 20
5 30

我使用以下脚本:

plot 'data.txt' u 1:2;
set xrange [1:3];
replot
set xrange [1:5];
replot

在第一张图中,我想将y轴范围设置为[3:8],但在第二张图中,y轴范围应该是[3:30]。如果我使用类似以下的代码:

set yrange [GPVAL_Y_MIN:GPVAL_Y_MAX]

无论xrange是什么,GPVAL_Y_MIN和GPVAL_Y_MAX的值都是相同的。

是否有任何解决方案?


2
我只需使用 set yrange [*:*] 即可达到相同的效果。 - SDsolar
3个回答

22
您需要的变量是GPVAL_DATA_Y_MINGPVAL_DATA_Y_MAX,它们是在特定范围内绘制的数据的y轴最小/最大值。一般来说,GPVAL_Y_MINGPVAL_Y_MAX并不是很有用,因为它们告诉您图形边界的位置(通常这些值会在GPVAL_DATA...变量之外留出一些空间,因为gnuplot会在数据和图形边界之间保留一些空隙)。
要利用这些变量,您必须在绘图命令中使用范围限定符:
plot [1:3] 'data.txt'
set yr [GPVAL_DATA_Y_MIN:GPVAL_DATA_Y_MAX]
replot
...
顺便提一下,u 1:2 规范是多余的,除非你想提醒自己正在绘制哪些列,因为将前两列作为 x 和 y 进行绘图是 gnuplot 的默认设置。如果你不想重新绘制到相同的输出终端(在某些终端中这并不有用,比如 eps 终端,因为重新绘制会生成一个带有相同图形的第二个页面),请使用此命令序列:
set terminal unknown
plot [1:3] 'data.txt'
set terminal <actual output terminal here>
set output 'output.trm'
plot [1:3][GPVAL_DATA_Y_MIN:GPVAL_DATA_Y_MAX] 'data.txt'
请注意再次使用范围说明符,这次指定了y范围。这比使用set yrange更紧凑,但会使代码行变得更长。
如果您拥有gnuplot 4.6.0或更高版本,可以利用stats命令避免重新绘图。 stats命令会创建一些方便的变量。
stats [1:3] 'data.txt'
plot [1:3][stats_min_y:stats_max_y] 'data.txt'

稍有不同的指令:

stats [1:3] 'data.txt'
plot [stats_min_x:stats_max_x][stats_min_y:stats_max_y] 'data.txt'

根据实际数据在x轴方向填充图形。例如,如果您有数据点{(1.1, 3), (2, 4), (2.9,5)},则x范围将设置为[1.1:2.9]。


1
只是为了完整起见:GPVAL_DATA_...是未记录的(在4.6中,Ubuntu 14.04的默认版本),但它们确实存在,仅在第一个数据绘图之后才填充。 - kebs
2
使用gnuplot 5.0.6(以及可能在该版本之前),它不再是stats_max_y,而是STATS_max_y(以及相应的变量名称更改)。 - kartoffelsalat

4

将yrange设置为GPVAL_DATA_Y_MIN:GPVAL_DATA_Y_MAX的缺点是不使用gnuplot的自动缩放功能,这会将范围扩展到下一个刻度。

因此,在自动绘图中,我更喜欢以下方式:

f(x)=sin(x)>0.5? 1:-1 #example function

set ytics 0.2
plot  1.01*f(x) # dummy plot to set GPVAL_*
set yrange [GPVAL_Y_MIN:GPVAL_Y_MAX]

plot f(x) # actual plot

当然,这同样适用于数据图:
plot 'data.csv' u 1:(1.01*$2)
set yrange [GPVAL_Y_MIN:GPVAL_Y_MAX]
plot 'data.csv' u 1:2

0
我这样使用它来定义一个函数的 x 范围。
plot [0:5] sin(10*x) + cos(3*x)

此外,您可以在绘图之前设置范围

set xrange [0:5]
plot sin(10*x) + cos(3*x)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接