我正在绘制一些具有不同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 sholud是[3:30]。如果我使用像
这样的东西set yrange [GPVAL_Y_MIN:GPVAL_Y_MAX]
GPVAL_Y_MIN和GPVAL_Y_MAX具有与xrange无关的相同值。
任何解决方案?
答案 0 :(得分:15)
您想要的变量是GPVAL_DATA_Y_MIN
和GPVAL_DATA_Y_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'
请注意再次使用范围说明符,这次指定了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 :(得分: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
答案 2 :(得分:0)