gnuplot:如何设置自定义非线性比例

gnuplot:如何设置自定义非线性比例,gnuplot,Gnuplot,是否有可能使用具有自定义坡折点的非线性比例? 例如:我希望y比例的一半显示范围[0:1],另一半显示范围[1:5],我不希望使用对数比例 最好的办法是提供一个映射函数。 当然,可以直接映射函数结果,但这样一来,标签将不适合实际数据 有可能吗?我搜索了一点,但我不确定我是否遗漏了什么,或者这是不可能的。这可以通过设置链接来完成,该链接仅在4.7开发版本中可用 以下脚本执行映射,但标签位于y2-轴上: reset f(x) = x <= 1 ? x : 1 + (x-1)*4 i(x) = x

是否有可能使用具有自定义坡折点的非线性比例? 例如:我希望y比例的一半显示范围[0:1],另一半显示范围[1:5],我不希望使用对数比例

最好的办法是提供一个映射函数。 当然,可以直接映射函数结果,但这样一来,标签将不适合实际数据


有可能吗?我搜索了一点,但我不确定我是否遗漏了什么,或者这是不可能的。

这可以通过
设置链接来完成,该链接仅在4.7开发版本中可用

以下脚本执行映射,但标签位于
y2
-轴上:

reset
f(x) = x <= 1 ? x : 1 + (x-1)*4
i(x) = x <= 1 ? x : (x-1)/4.0 + 1
set link y2 via f(y) inverse i(y)

unset ytics
set y2tics mirror

set xrange[0:5]
set yrange[0:2]
plot x axes x1y2
reset
set terminal pngcairo size 800,500
set output 'output.png'

f(x) = x <= 1 ? x : 1 + (x-1)*4
i(x) = x <= 1 ? x : (x-1)/4.0 + 1
set link y2 via f(y) inverse i(y)

unset ytics
set lmargin at screen 0.1
set rmargin at screen 0.95
set y2tics mirror offset graph -1.04 right
# set y2tics add (0.5)
set my2tics 2
set y2tics add ('' 0.25 1, '' 0.75 1)
set ylabel 'ylabel' offset -4

set xrange[0:5]
set yrange[0:2]
plot x axes x1y2
这很难看,但它是有效的。它只需要稍微修改左右边距和偏移量

编辑:我添加了次要tic,频率在
0
1
之间。我认为为
0.5
添加一个标签可能会很有用,以显示比例是线性的,但具有不同的梯度(在这种情况下,您可能还希望
将y2tics格式“%.1f”
设置为所有标签都有一个十进制数字)。但是,此tic也会显示为主要tic,因为目前还不支持为次要tic使用标签

结果是:

您有几个选项来完成这种绘图。我将使用以下示例数据:

0 0
1 0.5
2 0.6
3 1
4 1.5
5 0.5
6 2.5
7 5
8 2
多点法 在这里,您只需将相同数据的两个图相互叠加即可。请注意,当数据穿过绘图边界时,线中有一个接头(如果绘制线)

这比下面的映射方法要复杂一些

#!/usr/bin/env gnuplot

reset

set terminal pdfcairo enhanced color lw 3 size 3,2 font 'Arial,14'
set output 'output.pdf'

set style data linespoints

set title 'my plot'
set key top left

set multiplot layout 2,1

### first (top) plot
# play with margins to ensure top and bottom plots are same size
set bmargin 0
set tmargin 2.5
# also that left margin is same with/without y label
set lmargin 6

set yrange [1:5]

unset xtics
set ytics 1 out scale 0.5 nomirror

# remove bottom line of border
set border 14

plot 'data.dat' pt 7 title 'my data'

### second (bottom) plot
unset title

# set margins to match first plot
set bmargin 2.5
set tmargin 0

set yrange [0:1]

# this offset along with the label offset compresses the bottom whitespace
set xtics out scale 0.5 nomirror offset 0,0.4

# create and place labels where they will be visible
set xlabel 'x label' offset 0,0.8
set ylabel 'y label' offset 1,3

# remove top line of border
set border 11
plot 'data.dat' pt 7 notitle

unset multiplot

reset
结果:

映射方法 这里我们创建一个映射函数,并操纵y标签以匹配。请注意,管线中没有接头,这可能是您想要的接头,也可能不是您想要的接头

#!/usr/bin/env gnuplot

reset

set terminal pdfcairo enhanced color lw 3 size 3,2 font 'Arial,14'
set output 'output2.pdf'

set style data linespoints

set key top left

set title 'my plot'
set xlabel 'x label'
set ylabel 'y label'

# mapping function
map(x) = x <= 1.0 ? x : (x-1.0)/4.0 + 1.0

# upper y bound is set by (5-1.0)/4.0 + 1.0
set yrange [0:2]
# y labels create illusion
set ytics out scale 0.5 nomirror \
  ("0" 0, "1" 1, "2" 1.25, "3" 1.5, "4" 1.75, "5" 2)
set xtics out scale 0.5 nomirror

plot 'data.dat' u 1:(map($2)) pt 7 title 'my data'

reset
#/usr/bin/env gnuplot
重置
设置终端pdfcairo增强颜色lw 3大小3,2字体'Arial,14'
设置输出“output2.pdf”
设置样式数据线点
将键设置为左上角
设置标题“我的情节”
设置xlabel“x标签”
设置y标签“y标签”
#映射函数

map(x)=x我认为,自动执行此操作的唯一方法是使用
设置链接
,该链接自4.7版开始提供,但我的第一次尝试没有成功:
I(x)=x@Christoph我不明白link cmd有何帮助。如果我通过y**2反向sqrt(y)
绘图x轴x1y2
指定
设置链接y2,或者直接使用
绘图sqrt(x)
,则相同。在这两种情况下,y轴比例显示错误的数据请参见我的答案。这是我能想到的最“方便”的变体。有趣的答案——我不会想到那样使用
set link
(不熟悉该命令).还有一个问题:轴标题在轴tics标签中绘制,如果在拉伸的标签中可以增加m2tics频率,则ne plus ultra将是area@vlad_tepesch对不起,我不明白你关于标题的问题。如果您指的是
ylabel
,那么也可以使用偏移量:
set ylabel'mylabel'offset-3
,但您需要为此增加
lmargin
。我认为不可能在拉伸区域增加m2tics。但是我一直在想,如果把这些贴图转移到一个轴上,而不是链接,这不是很简单的话。我将查看代码…@vlad_tepesch当然,您可以添加自定义的小技巧,请参见编辑后的答案
:)
。谢谢。我自己得到了这个数字。也谢谢你的编辑