有没有办法在多时段设置中对齐不同绘图的角落?
有没有办法将axis
坐标转换为screen
坐标?
我正在尝试使用gnuplot布局一个非常复杂的画布。为了实现我想要的,我需要完全堆叠不同的图。
我做了类似的事情:
reset;
set samples 20;
set xrange [-pi:pi]; set yrange [-2:1];
set xlabel "x"; set ylabel "y";
unset key
set multiplot;
plot cos(x) w lp;
plot 2*cos(x+pi) w lp;
unset multiplot;
但是,标签,抽搐和边框等一些组件会被绘制两次。然后,当我使用cairolatex
终端执行此操作时,结果不像我不堆叠图表那样清晰。
因此,我想为第一个绘图绘制这些组件,然后取消设置后续标签的标签,抽搐和边框,如下面的代码段所示:
set multiplot;
plot cos(x) w lp;
set border ls 4; # Just to distinguish it
unset xlabel; unset ylabel;
unset tics;
plot 2*cos(x+pi) w lp;
unset multiplot;
这将生成一个图像,其中下一个图未与第一个图对齐(左侧和底部),因为标签和抽搐没有占用空间。
要解决此问题,我需要手动设置下一个图的原点和大小。左下角必须对齐。
从gnuplot文档中,可以使用以下方式获取screen
坐标的(X,Y) axis
坐标:
GRAPH_X = (X - GPVAL_X_MIN) / (GPVAL_X_MAX - GPVAL_X_MIN)
GRAPH_Y = (Y - GPVAL_Y_MIN) / (GPVAL_Y_MAX - GPVAL_Y_MIN)
SCREEN_X = GPVAL_TERM_XMIN + GRAPH_X * (GPVAL_TERM_XMAX - GPVAL_TERM_XMIN)
SCREEN_Y = GPVAL_TERM_YMIN + GRAPH_Y * (GPVAL_TERM_YMAX - GPVAL_TERM_YMIN)
FRAC_X = SCREEN_X * GPVAL_TERM_SCALE / GPVAL_TERM_XSIZE
FRAC_Y = SCREEN_Y * GPVAL_TERM_SCALE / GPVAL_TERM_YSIZE
当我们尝试对齐左下角时,(X,Y) == (GPVAL_X_MIN, GPVAL_Y_MIN)
。因此,GRAPH_* = 0
和SCREEN_(*) = GPVAL_TERM_\1MIN
。因此:
# Multiply by 1.0 to promote variables to floats
FRAC_X = 1.0 * GPVAL_TERM_XMIN * GPVAL_TERM_SCALE / GPVAL_TERM_XSIZE
FRAC_Y = 1.0 * GPVAL_TERM_YMIN * GPVAL_TERM_SCALE / GPVAL_TERM_YSIZE
结果摘录:
set multiplot;
plot cos(x) w lp;
FRAC_X = 1.0 * GPVAL_TERM_XMIN * GPVAL_TERM_SCALE / GPVAL_TERM_XSIZE;
FRAC_Y = 1.0 * GPVAL_TERM_YMIN * GPVAL_TERM_SCALE / GPVAL_TERM_YSIZE;
set origin FRAC_X, FRAC_Y;
set border ls 4; # Just to distinguish it
unset xlabel; unset ylabel;
unset tics;
plot 2*cos(x+pi) w lp;
unset multiplot;
但正如你所看到的,结果情节不是更好......
顺便说一句,我没有找到如何定义size
以对齐右上角。
原点计算有什么问题?如何对齐右上角?
亲切的问候,
亚历。
答案 0 :(得分:1)
您可以修复边距以保持第一个图之后的自动尺寸,如下所示(另请参阅https://stackoverflow.com/a/19132068/2604213):
fix_margins = 'set margins '.\
'screen GPVAL_TERM_SCALE * GPVAL_TERM_XMIN/(1.0*GPVAL_TERM_XSIZE), '.\
'screen GPVAL_TERM_SCALE * GPVAL_TERM_XMAX/(1.0*GPVAL_TERM_XSIZE), '.\
'screen GPVAL_TERM_SCALE * GPVAL_TERM_YMIN/(1.0*GPVAL_TERM_YSIZE), '.\
'screen GPVAL_TERM_SCALE * GPVAL_TERM_YMAX/(1.0*GPVAL_TERM_YSIZE)'
set samples 20
set xrange [-pi:pi]; set yrange [-2:1]
set xlabel "x"; set ylabel "y"
unset key
set multiplot
plot cos(x) w lp
eval(fix_margins)
unset tics; unset xlabel; unset ylabel
plot 2*cos(x+pi) w lp
unset multiplot
答案 1 :(得分:0)
为了实现精确重叠,我认为可以选择手动调整margin
:
set terminal pngcairo
set output 'fig.png'
eps_h = 0.1
eps_w = 0.1
set multiplot
unset key
set lmargin at screen 2*eps_w
set tmargin at screen 1 - eps_h
set rmargin at screen 1 - eps_w
set bmargin at screen eps_h
plot cos(x) w lp lc rgb 'dark-red'
set border ls 4;
unset xlabel
unset ylabel
unset tics
plot 2*cos(x+pi) w lp lc rgb 'royalblue'