gnuplot坐标系之间的转换

时间:2017-05-18 09:31:50

标签: gnuplot

TL; DR

有没有办法在多时段设置中对齐不同绘图的角落?

有没有办法将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;

这将生成一个图像,其中下一个图未与第一个图对齐(左侧和底部),因为标签和抽搐没有占用空间。

Not aligned borders

要解决此问题,我需要手动设置下一个图的原点和大小。左下角必须对齐。

从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_* = 0SCREEN_(*) = 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;

但正如你所看到的,结果情节不是更好......

Origin not matching

顺便说一句,我没有找到如何定义size以对齐右上角。

问题

原点计算有什么问题?如何对齐右上角?

亲切的问候,

亚历。

2 个答案:

答案 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'

给出: enter image description here