我需要在坐标系上绘制一个函数,该坐标系的原点位于屏幕中心(或靠近中心的某个地方,但不一定在中心),我需要绘制轴,以便它们在原点处交叉。轴也应该有标签和抽动,以及箭头。
我不知道如何有效地做到这一点,到目前为止,在我的代码中,我为我的抽动手动设置偏移量,并使用偏移量手动绘制箭头。我还在轴标签上设置了偏移量。所有这些都非常脆弱,偏移量会根据终端设置而变化。
有人可以帮助我提供示例代码或解释如何以正确的方式执行此操作吗?
我需要在坐标系上绘制一个函数,该坐标系的原点位于屏幕中心(或靠近中心的某个地方,但不一定在中心),我需要绘制轴,以便它们在原点处交叉。轴也应该有标签和抽动,以及箭头。
我不知道如何有效地做到这一点,到目前为止,在我的代码中,我为我的抽动手动设置偏移量,并使用偏移量手动绘制箭头。我还在轴标签上设置了偏移量。所有这些都非常脆弱,偏移量会根据终端设置而变化。
有人可以帮助我提供示例代码或解释如何以正确的方式执行此操作吗?
好吧,使用 _zeroaxis 是获取抽动和标签的“正确”方法:设置 _range 可为您提供使 0,0 居中的对称性……一旦您知道 _range,您就可以手动绘制箭头。
set xzeroaxis
set xtics axis
set xrange [-10:10]
set arrow 1 from -9,0 to -10,0
set arrow 2 from 9,0 to 10,0
set yzeroaxis
set ytics axis
set yrange [-1:1]
set arrow 3 from 0,-.9 to 0,-1
set arrow 4 from 0,.9 to 0,1
set border 0
plot sin(x)
黑客攻击!
set term pngcairo truecolor size 300,300 font "Arial,12"
set out 'plot.png'
# x,y min/max and center
xmin = -10
xc = 0
xmax = 10
ymin = -2
yc = 0
ymax = 2
# default borders
tm = 1
bm = 1
rm = 4
lm = 4
# arrow scale factor to cover last tic
af = 1.05
set arrow from xc,yc to xmin*af,yc filled size 0.6,30
set arrow from xc,yc to xmax*af,yc filled size 0.6,30
set arrow from xc,yc to xc,ymax*af filled size 0.6,30
set arrow from xc,yc to xc,ymin*af filled size 0.6,30
set multiplot layout 2,2
## Plot 1, top left
set key top left
set xr [xmin:xc]
set yr [yc:ymax]
set tmargin tm
set bmargin 0
set rmargin 0
set lmargin lm
set border 9
unset ytics
set xtics nomirror
plot sin(x)
## Plot 2, top right
unset key
set xr [xc:xmax]
set lmargin 0
set rmargin rm
set border 3
set ytics nomirror
replot
## Plot 3, bottom left
set xr [xmin:xc]
set yr [ymin:yc]
set bmargin bm
set tmargin 0
set lmargin lm
set rmargin 0
set border 12
unset tics
replot
## Plot 4, bottom right
set xr [xc:xmax]
set lmargin 0
set rmargin rm
set border 6
set ytics nomirror
replot
unset multiplot
我得到这个输出:
也就是说,您可能会考虑该zeroaxis
选项。这里有一个演示。遗憾的是,此选项不会将轴绘制为零,而只是在该位置放置一条线。
我不会说我的方法是“有效的”,但除了更改正在绘制的函数/数据之外,可能不需要太多努力来修改它,因为大部分工作都是通过replot
命令完成的。我不知道让 gnuplot 将箭头放在轴的末尾或更改轴的本地绘制位置的选项。
除了 Jim 的回答,如果需要,可以将抽动和轴放在前面
# bring the grid over the plot
set grid front
# remove grid if not required
unset grid