GNUplot自动缩放设置x轴范围等于y轴范围。

6
我正在使用GNUplot从数据文件绘制轨道图。我想使用autoscale xy,这样GNUplot脚本就不需要根据数据进行编辑。然而,当我绘制时,autoscale不会将xrange设置为与yrange相同。这使得轨道看起来"被挤压"。
我尝试使用set size squareset size ratio -1,但这并没有起作用。如何在gnuplot中设置相等比例尺的长度
有没有办法强制autoscale使x和y范围相等?
谢谢!
1个回答

5
不,没有选项可以自动缩放x和y轴范围到相同的值。以下是一个解决方案,您可以使用一些技巧来实现。
如果您想保持gnuplot扩展到下一个刻度的范围,可以按照以下步骤操作:
首先,您必须使用未知终端绘制一次图形。这将保存x和y范围在gnuplot变量GPVAL_X_MIN、GPVAL_X_MAX、GPVAL_Y_MIN和GPVAL_Y_MAX中。然后您设置范围并重新绘制:
set terminal push # save current terminal
set terminal unknown
plot 'datafile'
set terminal pop # restore previous terminal

min = (GPVAL_Y_MIN < GPVAL_X_MIN ? GPVAL_Y_MIN : GPVAL_X_MIN)
max = (GPVAL_Y_MAX > GPVAL_X_MAX ? GPVAL_Y_MAX : GPVAL_X_MAX)

set xrange[min:max]
set yrange[min:max]
set size ratio -1

replot

如果您想保留初始终端设置,则只需要使用推/弹出操作。

为了使其可重用,例如在multiplot中使用,您可以将所有这些命令包装在一个字符串中,并对其调用eval

autoscale_xy(datafile) = \
    "set terminal push; set terminal unknown; set autoscale;".\
    "plot '".datafile."'; set terminal pop;".\
    "min = (GPVAL_Y_MIN < GPVAL_X_MIN ? GPVAL_Y_MIN : GPVAL_X_MIN);".\
    "max = (GPVAL_Y_MAX > GPVAL_X_MAX ? GPVAL_Y_MAX : GPVAL_X_MAX);".\
    "set xrange[min:max]; set yrange[min:max];"
...

files = "first second third fourth"
do for [f in files] {
    eval(autoscale_xy(f))
    plot f
}

另一种选择是使用 stats 计算最大和最小的x和y值,并相应地设置范围:
stats 'datafile' using 1:2 nooutput
min = (STATS_min_y < STATS_min_x ? STATS_min_y : STATS_min_x)
min = (STATS_max_y > STATS_max_x ? STATS_max_y : STATS_max_x)

sc = 1.05
set xrange[sc*min:sc*max]
set yrange[sc*min:sc*max]
set size ratio -1

plot 'datafile'

感谢您提供的解决方案。然而,这种方法相当令人沮丧,因为我正在使用“multiplot”从数据文件中绘制4个不同列的图形。对于每个数据集都要这样做并不理想,但是可以解决。 - Rohan
是的,确实如此。我更新了我的答案,向您展示了如何将所有这些内容放入字符串中,并使用“eval”使其可重复使用。 - Christoph

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