首页 > 解决方案 > 如何在对数刻度图中获得(自动)偏移量?

问题描述

该选项set offsets对日志图没有影响。

例如,下面的两个数字都是用 生成的set offsets 0,2,0,0

在此处输入图像描述在此处输入图像描述

为了获得相同的效果,我目前正在设置固定范围而不是使用自动缩放,这是非最佳的,因为该脚本旨在从批量数据中生成图。

从 Gnuplot 5.2 开始,我们将设置日志”重新实现为“设置非线性”的特例,并且设置非线性使用两个轴,因为它类似于set link命令,只是两者中只有一个链接的轴是可见的',并且由于文档还明确指出'偏移量仅影响 x1 和 y1 轴',因此似乎这是预期的行为,而不是错误。

问题:有没有一种简单的方法可以为日志图获得类似的自动缩放偏移量?

我想可以制作一个虚拟图并使用数据范围来设置输出图中的轴范围,但是有更好的方法吗?

为了完整起见,生成上述数字的最少代码是:

set terminal pngcairo size 250,250
set output "1.png"
set offsets 0,2,0,0
plot [0.1:1] 1/x

set terminal pngcairo size 250,250
set output "2.png"
set logscale
set offsets 0,2,0,0
plot [0.1:1] 1/x

标签: gnuplot

解决方案


正如您在问题中已经提到的,您可以创建一个虚拟图并将您的偏移量添加到范围中。

关键是您只能绘图后获取GPVAL_...变量。所以,目前我看不到另一种创建虚拟图的方法,除非这个对数轴的偏移量将在 gnuplot 本身中实现。

macros下面的示例是尝试使用and使此重新绘制更容易处理evaluate(),请参阅help macrosand help evaluate。如果您批量处理许多图,可能会有点简化。也许有人会找到一种方法来缩短它。

当然,您也可以设置myRange = [*:*]为自动量程myOffsets并将其添加到自动量程限制中。

代码:

### offsets for logarithmic scale
reset session
set term pngcairo size 300,300

SetMyOffsets(n) = sprintf("[%g:%g][%g:%g]", \
                    GPVAL_X_MIN-word(myOffsets,1), \
                    GPVAL_X_MAX+word(myOffsets,2), \
                    GPVAL_Y_MIN-word(myOffsets,4), \
                    GPVAL_Y_MAX+word(myOffsets,3))

GenerateOutput = 'set output myOutput; \
                  eval(myPlot); \
                  set output; \
                  set output myOutput; \
                  myRange=SetMyOffsets(0); \
                  eval(myPlot); \
                  set output'

# first plot with linear x-axis
myRange = '[0.1:1]'
myPlot  = 'plot @myRange 1/x'
myOffsets = '0 2 0 0'           # left right top bottom
myOutput = "Linear.png"
@GenerateOutput

# second plot with log x-axis
set logscale
myRange   = '[0.1:1]'
myPlot    = 'plot @myRange 1/x'
myOffsets = '0 2 0 0'           # l r t b
myOutput = "Logarithmic.png"
@GenerateOutput

### end of code

结果:

在此处输入图像描述在此处输入图像描述


推荐阅读