Gnuplot 具有共享x轴的交互式多点打印

Gnuplot 具有共享x轴的交互式多点打印,gnuplot,Gnuplot,我经常用一个模型绘制有噪声的数据。残差显示在底部面板中: set colors classic set samp 20000 set table $data plot '+' u 1:(y=10*(sin(10*$1))):(y-invnorm(rand(0))) w e unset table set multiplot layout 2,1 plot $data us 1:($2+$3):3 w p pt 7 ps 0.5 t "noisy data", $data us 1:2

我经常用一个模型绘制有噪声的数据。残差显示在底部面板中:

set colors classic
set samp 20000

set table $data
    plot '+' u 1:(y=10*(sin(10*$1))):(y-invnorm(rand(0))) w e
unset table

set multiplot layout 2,1
plot $data us 1:($2+$3):3 w p pt 7 ps 0.5 t "noisy data", $data us 1:2 w l lc 3 t "model"
plot $data us 1:3 w p pt 7 ps .5 t "noise"
unset multiplot
但是,这不再是交互式的。缩放后,一个绘图将丢失。Matplotlib在此处具有共享轴

我目前的方法也不令人满意,但至少在仅水平缩放时有效

set autoscale y2fix 
set y2range [-5:25]
plot [][-30:] $data us 1:($2+$3):3 w p pt 7 ps 0.5 t "noisy data", $data us 1:2 w l lc 3 t "model", $data us 1:3 w p pt 7 ps .5 t "noise" axis x1y2

有更好的方法吗

不幸的是,gnuplot将来可能无法拥有交互式多点?。我也希望看到鼠标坐标在一个多点。显然,只有在只有一个绘图时才能进行缩放。 因此,以下奇怪的解决方法可能会对您有所帮助

定义键绑定以显示不同的绘图,例如0=多点,1=第一个绘图,2=第二个绘图 使用Multipot自动缩放重新定义a的绑定 创建一个可以退出的无休止循环,例如通过键绑定x退出 用法:

按1或2键可获得所需的绘图,并根据需要放大 通过0切换回multiplot 按x退出循环 您还可以将gnuplot内置绑定p和n用于上一次缩放和下一次缩放。 键入show bind以查看所有键绑定。 以下内容可以作为进一步优化和调整的起点,以满足您的确切需求

代码:

结果:

多点

多点放大:


不幸的是,gnuplot将来可能无法拥有交互式多点?。我也希望看到鼠标坐标在一个多点。显然,只有在只有一个绘图时才能进行缩放。 因此,以下奇怪的解决方法可能会对您有所帮助

定义键绑定以显示不同的绘图,例如0=多点,1=第一个绘图,2=第二个绘图 使用Multipot自动缩放重新定义a的绑定 创建一个可以退出的无休止循环,例如通过键绑定x退出 用法:

按1或2键可获得所需的绘图,并根据需要放大 通过0切换回multiplot 按x退出循环 您还可以将gnuplot内置绑定p和n用于上一次缩放和下一次缩放。 键入show bind以查看所有键绑定。 以下内容可以作为进一步优化和调整的起点,以满足您的确切需求

代码:

结果:

多点

多点放大:


根据@theozh关于在while循环中重新绘制所有内容的建议,此版本会在鼠标单击时做出反应。每次单击鼠标左键都会重新绘制multiplot

set colors classic
set samp 20000
set table $data
    plot '+' u 1:(y=10*(sin(10*$1))):(y-invnorm(rand(0))) w e
unset table

cond=1; while(cond) {
   set yrange [*:*]
   set multiplot layout 2,1 upwards
   unset label 1
   plot $data us 1:3 w p pt 7 ps .5 t 'noise'
   set label 1 at graph 0.01, graph 0.95 "middle click = stop" boxed front
   plot $data us 1:($2+$3):3 w p pt 7 ps 0.5 t 'noisy data', $data us 1:2 w l lc 3 t 'model'
   unset multiplot

   pause mouse button1,button2
   cond = MOUSE_KEY != 2   # exit on middle click
}
右键单击开始矩形缩放,左键单击结束矩形缩放,它看起来仍然平滑,但速度不如具有轴x1y2的版本。 不幸的是,由于bind不适用于鼠标事件,因此使用pause和while循环来模拟这种行为


根据@theozh关于在while循环中重新绘制所有内容的建议,此版本会在鼠标单击时做出反应。每次单击鼠标左键都会重新绘制multiplot

set colors classic
set samp 20000
set table $data
    plot '+' u 1:(y=10*(sin(10*$1))):(y-invnorm(rand(0))) w e
unset table

cond=1; while(cond) {
   set yrange [*:*]
   set multiplot layout 2,1 upwards
   unset label 1
   plot $data us 1:3 w p pt 7 ps .5 t 'noise'
   set label 1 at graph 0.01, graph 0.95 "middle click = stop" boxed front
   plot $data us 1:($2+$3):3 w p pt 7 ps 0.5 t 'noisy data', $data us 1:2 w l lc 3 t 'model'
   unset multiplot

   pause mouse button1,button2
   cond = MOUSE_KEY != 2   # exit on middle click
}
右键单击开始矩形缩放,左键单击结束矩形缩放,它看起来仍然平滑,但速度不如具有轴x1y2的版本。 不幸的是,由于bind不适用于鼠标事件,因此使用pause和while循环来模拟这种行为


凉的我没有想到老鼠。它更短,更简单,使用鼠标更方便。酷!我没有想到老鼠。它更短、更简单,使用鼠标更方便。