20

我正在绘制一些具有不同 X 范围的数据,我想根据当前 X 范围内数据的最大值和最小值来更改 yrange。当我使用 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

在第一个图中,我想在 [3:8] 中设置 yrange,但在第二个图中,yrange 应该是 [3:30]。如果我使用类似的东西

set yrange [GPVAL_Y_MIN:GPVAL_Y_MAX]

GPVAL_Y_MIN 和 GPVAL_Y_MAX 具有独立于 xrange 的相同值。

有什么解决办法吗?

4

3 回答 3

22

您想要的变量是GPVAL_DATA_Y_MINGPVAL_DATA_Y_MAX,它们是在一定范围内绘制的数据的 y-min/max。 GPVAL_Y_MIN并且GPVAL_Y_MAX通常不太有用,因为它们会告诉您绘图边界的边缘在哪里(通常这些值会稍微超出GPVAL_DATA...变量,因为 gnuplot 在数据和绘图边缘之间留下了一点空间)。

要利用这些变量,您必须在 plot 命令中使用范围说明符:

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'

请注意再次使用范围说明符,这次指定了范围。这比使用指定要紧凑一些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]。

于 2012-11-27T11:52:49.767 回答
4

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

因此,在自动绘图中,我更喜欢以下内容

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
于 2016-03-03T13:50:30.077 回答
0

我用它来定义一个函数的 x 范围

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

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

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

在此处输入图像描述

于 2019-08-07T15:03:17.117 回答