gnuplot - 如何在对数刻度图中获得(自动)偏移量?
问题描述
该选项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
解决方案
正如您在问题中已经提到的,您可以创建一个虚拟图并将您的偏移量添加到范围中。
关键是您只能在绘图后获取GPVAL_...
变量。所以,目前我看不到另一种创建虚拟图的方法,除非这个对数轴的偏移量将在 gnuplot 本身中实现。
macros
下面的示例是尝试使用and使此重新绘制更容易处理evaluate()
,请参阅help macros
and 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
结果:
推荐阅读
- flask - 我想比较数据库中的信息但出错
- xml - Indeed XML Feed 状态检查
- android - 如何观察 Moshi Kotlin 中的意外响应?
- flutter - Flutter InteractiveViewer 使图片高度
- python - Pytorch-lightning 奇怪的错误:实现的方法没有覆盖其父方法
- flutter - 如何在 Flutter 中将社交媒体链接/按钮添加到我的应用程序?
- python - 从 while True 打印值:在 Python 中
- c++ - 为什么 unsigned char 的默认初始化行为与其他数据类型不同?
- cross-validation - 在训练集上使用 k 折交叉验证后,是否需要额外的验证集?
- ruby-on-rails - 在 require 方法中免除属性