版本5.2包含set nonlinear
。可以按照演示here中的建议使用它来构造断轴。我正在尝试按照x轴也对数的步骤进行操作。当前代码以及数据如下。我无法弄清楚的问题是休息后的一阶缩放,如下图所示:
您可以看到问题在0.1到1之间。我在做什么错了?
data="test2.txt"
unset nonlinear x
x1min=1e-6
x1max=1e-5
x2min=1e-1
x2max=1e+3
ymin =1e-1
ymax =1e+3
dx=(x2min - x1max)
set yrange [ymin:ymax]
unset key
set format x "10^{%T}
set xtics font ",12"
set ytics font ",12"
set y2tics font ",12"
axis_gap=1
f(x) = (x <= x1max) ? log10(x) : (x < x2min) ? NaN : log10(x - dx + axis_gap)
g(x) = (x <= x1max) ? 10**x : (x < x1max + axis_gap) ? NaN : 10**(x + dx - axis_gap)
set xrange [x1min:x2max] nereverse nowriteback
set nonlinear x via f(x) inverse g(x)
set logscale y
set xtics (1e-6 0,2e-6 1,3e-6 1,4e-6 1,5e-6 1,6e-6 1,7e-6 1,8e-6 1,9e-6 1,1e-5 0,2e-5 1,3e-5 1,4e-5 1,5e-5 1,6e-5 1,7e-5 1,8e-5 1,9e-5 1,1e-2 0,2e-2 1,3e-2 1,4e-2 1,5e-2 1,6e-2 1,7e-2 1,8e-2 1,9e-2 1,1e-1 0,2e-1 1,3e-1 1,4e-1 1,5e-1 1,6e-1 1,7e-1 1,8e-1 1,9e-1 1,1 0,2 1,3 1,4 1,5 1,6 1,7 1,8 1,9 1,10 0,20 1,30 1,40 1,50 1,60 1,70 1,80 1,90 1,100 0,200 1,300 1,400 1,500 1,600 1,700 1,800 1,900 1,1000 0)
plot data u 1:2
数据在哪里:
5 0.471238898038469
4.18879020478639e-6 0.7
4.18879020478639e-6 2
4.18879020478639e-6 8.8
4.18879020478639e-6 2.8
1 4.18879020478639e-6
1 4.18879020478639e-6
98.174770424681 1.68
98.174770424681 3.4
0.125663706143592 161.809725
0.125663706143592 425.60861
0.125663706143592 425.60861
0.125663706143592 425.60861
0.125663706143592 483.467845
144 43.14926
1 50.99458
1 51.975245
1 52.95591
1 54.91724
1 57.859235
1 66.68522
1 69.627215
1 78.4532
1.728 32.361945
1.728 40.207265
1.728 41.18793
1.728 43.14926
1.728 45.11059
1.728 48.052585
1.728 54.91724
1.728 65.704555
3.375 46.091255
3.375 50.99458
3.375 54.91724
3.375 56.87857
3.375 57.859235
3.375 64.72389
8 24.516625
8 43.14926
8 46.091255
8 51.975245
8 54.91724
8 59.820565
15.625 47.07192
15.625 48.052585
15.625 50.99458
15.625 52.95591
15.625 55.897905
64 42.168595
64 42.168595
64 48.052585
125 35.30394
125 42.168595
125 50.013915
我开始悬赏这个问题。我要添加另一个示例,一个更简单的示例:
unset key
unset nonlinear x
unset nonlinear x2
axis_gap=1
x1min=1
x1max=3
x2min=5
x2max=20
ymin =1e-1
ymax =1e+3
dx=(x2min - x1max)
x1minp=log10(x1min)
x1maxp=log10(x1max)
x2minp=log10(x2min)
x2maxp=log10(x2max)
set yrange [ymin:ymax]
set xrange [x1min:x2max] noreverse nowriteback
f(x) = (x <= x1max) ? log10(x) : (x < x2min) ? NaN : log10(x/(x2min/x1max)*axis_gap)
g(x) = (x <= x1maxp) ? 10**(x) : (x < log10(x1max*axis_gap)) ? NaN : 10**(x) + dx + log10(axis_gap)
set nonlinear x via f(x) inverse g(x)
set logscale y
set xtics (1e0 0,2e0 0,3e0 0,4e0 0,5e0 0,6e0 0,7e0 0,8e0 0,9e0 0,1e1 0,2e1 0)
plot 0 w l
在此版本中,我终于有了nonlinear
的概念,我宁愿考虑刻度距原点(gnuplot的不可见轴)的距离,该距离由f(x)确定,其中x为绘制范围内的数字,f(x)
是set nonlinear x via f(x) inverse g(x)
中的数字,而g(x)
从原点获取与位置x
的刻度相关的数字(将数字y(x)
y
绘制在y轴上,并显示在刻度上方/下方的x轴上。我觉得这比一些非线性可见和线性不可见轴概念要好得多,但前提是我这次确实正确地理解了它。
该解决方案不仅必须在两个样本上均不使用warning: could not confirm linked axis inverse mapping function
,而且还需要解释此更新中的功能出了什么问题,理想情况下是上述建议的距离和数字而不是可见的/不可见的gnuplot行话。
我也注意到了,看图片。
f(x) = (x <= x1max) ? log10(x) : (x < x2min) ? NaN : log10(x/(x2min/x1max)*axis_gap)
g(x) = (x <= x1maxp) ? 10**(x) : (x < log10(x1max*axis_gap)) ? NaN : 10**(x*(x2min/x1max)) + dx + log10(axis_gap)
您可以看到,窗口左下方显示的坐标的行为与预期(axis_gap=1.1
)相同,但与抽动(如果您绘制数据点(1 1,2 1,3 1,5 1, 6 1,...))的位置错误):
答案 0 :(得分:1)
您的方法中的逻辑错误是,要沿对数刻度轴移动,您需要乘以或除以偏移量,而不是加法或减法。因此,您的映射将类似于:
axis_gap = 1.e4
f(x) = (x <= x1max) ? log10(x) : (x < x2min) ? NaN : log10( (x/dx) / axis_gap)
g(x) = (x <= x1max) ? 10**x : (x < x1max + axis_gap) ? NaN : 10**( (x*dx) * axis_gap)
答案 1 :(得分:1)
修订后的答案:
看看gnuplot文档:
[版本5.2中的新命令]此命令类似于设置的链接 除了两个链接轴中只有一个是可见的命令外,该命令均可用。的 隐藏的轴保持线性。沿可见轴的坐标为 通过将
g(x)
应用于隐藏轴坐标来映射。f(x)
映射 可见轴坐标返回到隐藏的线性轴。示例:
set xrange [1:1000]
set nonlinear x via log10(x) inverse 10**x
这 示例建立对数比例的x轴。这是另一种方法 达到
set log x
的效果。在这种情况下,隐藏轴具有 通过计算range [0:3]
获得的[log10(xmin):log10(xmax)]
。您 必须同时提供正向和反向表达式。
换句话说:f(x)
是一个函数,它获取x数据输入值并将其映射到线性范围。如果您set logscale x
已经有了这样的映射,并且功能f(x)
就是log10(x)
。 g(x)
是反函数10**x
如果像您的情况那样轴断了,则必须定义一个适合的具有不同区域的映射函数。在下面,我选择了一个连续函数,其中BrokenAxisPos
是第二个轴应开始的值(相对于中断前的轴)。
请参见下图:
您要忽略的范围x1max
至x2min
被功能f(x)
压缩到范围x1max
至BrokenAxisPos
中(我将其设置为至1e-4)。它只需进行一些计算就可以正确确定函数f(x)
的因数。对于x2min
以上的值,函数f(x)将原始x值移动一些适当的值。
经过一小段计算后,g(x)是函数f(x)的逆。
使用代码:
### broken nonlinear (logarithmic) axis
reset session
set size square
data="test2.txt"
x1min=1e-6; x1max=1e-5
x2min=1e-1; x2max=1e+3
ymin =1e-1; ymax =1e+3
unset key
# settings x-axis
unset logscale x
set xrange[x1min:x2max]
set format x "10^{%T}"
set xtics font ",12"
# manually set major xtics
set xtics add ("0.1" 1e-1, "1" 1, "10" 10, "100" 100, "1000" 1000)
set mxtics 10
# settings y-axis
set logscale y
set format y "%g"
set yrange [ymin:ymax]
set ytics font ",12"
set grid xtics, ytics
BrokenAxisPos = 1e-4
m = log10(BrokenAxisPos/x1max)/log10(x2min/x1max)
f(x) = (x <= x1max) ? log10(x) : x<x2min ? log10(x1max**(1-m)*x**m) : log10(x*BrokenAxisPos/x2min)
g(x) = (x <= log10(x1max)) ? 10**x : x<log10(BrokenAxisPos) ? (10**x/x1max**(1-m))**(1/m) : (x2min/BrokenAxisPos)*10**x
set nonlinear x via f(x) inverse g(x)
# manually hide x1,x2 axis and y-gridlines by placing a rectangle
set obj 1 rect from x1max*1.2, graph 0 to x2min*0.8, graph 1 fs solid 1.0 border bgnd front
plot data u 1:2 w p
### end of code
顺便说一句,您和@Ethan一样,也可以通过将“ gap”-部分设置为NaN
来使用不连续的函数。然后,您可以简单地跳过m
的计算和使用。
f(x) = (x <= x1max) ? log10(x) : x<x2min ? NaN : log10(x*BrokenAxisPos/x2min)
g(x) = (x <= log10(x1max)) ? 10**x : x<log10(BrokenAxisPos) ? NaN : (x2min/BrokenAxisPos)*10**x
但是然后您必须适应轴的隐藏
set obj 1 rect from x1max*1.2, graph 0 to x2min*0.8, graph 1 fs solid 1.0 border bgnd front
到
set obj 1 rect from x1max, graph 0 to x2min, graph 1 fs solid 1.0 border bgnd front
因为x1max*1.2
和x2min*0.8
(用于仍然显示x网格线)将被映射到NaN
。
连续f(x)
和g(x)
,您将得到结果: