gnuplot与x27之间的转换;s坐标系 TL;博士
有没有办法在多点设置中对齐不同绘图的角点 有没有办法将gnuplot与x27之间的转换;s坐标系 TL;博士,gnuplot,Gnuplot,有没有办法在多点设置中对齐不同绘图的角点 有没有办法将轴坐标转换为屏幕坐标 详细说明 我正在尝试用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
轴
坐标转换为屏幕
坐标
详细说明
我正在尝试用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;
但是,某些组件(如标签、tics和边框)会绘制两次。然后,当我使用cairolatex
终端执行此操作时,结果并不像我不堆叠图那样清晰
因此,我希望为第一个绘图绘制这些组件,然后为后续绘图取消设置标签、tic和边框,如下面的代码段所示:
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;
这将生成一个图像,其中下一个绘图与第一个绘图不对齐(在左侧和底部),因为标签和TIC不占用空间
为了解决这个问题,我需要手动设置下一个绘图的原点和大小。左下角必须对齐
从gnuplot文档中,可以使用以下方法获得屏幕上坐标的(X,Y)轴
坐标:
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\u X\u MIN,GPVAL\u Y\u MIN)
。因此,GRAPH.*=0
和SCREEN.*=GPVAL\u TERM.\u1min
。因此:
# 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;
但正如你们所看到的,结果并不是更好
顺便说一下,我没有找到如何定义大小来对齐右上角
问题
原点计算有什么问题?如何对齐右上角
亲切问候,
Alexis.为了实现精确的重叠,我认为一种选择是手动调整边距
:
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'
其中:
您可以在第一次打印后固定边距以保持自动大小,如下所示(另请参见):
为什么需要重叠两个图,对于给定的示例,您可以简单地使用plot cos(x)w lp,2*cos(x+pi)w lp
,对于这个简单的示例,确保您的答案是正确的。不过,我的问题是需要重叠的情节。谢谢你的回答。这似乎比我提议的还要容易!然而,图并不完全重叠,有1或2个像素的差异。我想这是由于某种浮点近似。
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