【问题标题】:GNUplot Autoscale set xrange equal to yrangeGNUplot Autoscale 设置 xrange 等于 yrange
【发布时间】:2014-11-18 15:30:00
【问题描述】:

我正在使用 GNUplot 从数据文件中绘制轨道。我想使用autoscale xy,以便不需要根据数据编辑 GNUplot 脚本。但是,当我绘图时,autoscale 不会将xrange 设置为与yrange 相同。这使轨道看起来“被压扁”。

我尝试过使用set size square 和set size ratio -1 How to set equal scale's length in gnuplot。

但这没有用。

是否有强制autoscale 使 x 和 y 范围相等?

谢谢!

【问题讨论】:

    标签: plot gnuplot


    【解决方案1】:

    不,没有将 x 和 y 范围自动缩放到相同值的选项。这是一个解决方案,您可以通过一些技巧来做到这一点。

    如果你想保持 gnuplot 的范围扩展到下一个抽动,你可以这样做:

    您必须首先使用unknown 终端绘制一次。这会将 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 个图表。必须对每个数据集都这样做并不理想,但可行。
    • 是的,确实如此。我更新了我的答案,向您展示如何将所有这些东西放在一个字符串中并使用 eval 使其可重用。
    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 2020-11-06
    • 2020-08-21
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    相关资源
    最近更新 更多