3

我想以下列方式用gnuplot放置几个图:

 +------------------------+
 |plot1                   |
 |                        |
 +------------------------+
 +----------++------------+
 |plot2     ||plot3       |
 |          ||            |
 +----------++------------+
 +----------++------------+
 |plot4     ||plot5       |
 |          ||            |
 +----------++------------+

简单的 nxm 布局可以通过set multiplot layout n,m(参见 官方网站上的这些演示)来实现。

matplotlib正如您在文档中看到的那样,提供了更高级的可能性:使用 GridSpec 自定义子图的位置

在 gnuplot 中,我使用set originset size实现了这一点。但是,它相当繁琐,当您注意到以后要更改布局时,需要重新计算大小和位置。

备注 1: 通常将边距设置为固定大小以实现正确的绘图大小也很有用。通过改变 xlabels 等进行的自动计算将使实现正确布局变得更加困难。

备注 2:代替origin/sizegnuplot 提供了另一种使用set [lrbt]margin <> at screen设置绘图边界的可能性。用户必须确保标题和标签有足够的空间(参见演示)。仍然不是一个完美的解决方案,但有时更方便。

是否有我不知道的可能性,或者是否存在创建布局的工具?

4

2 回答 2

3

评论中提到的给定布局的最小工作示例。

set term pngcairo size 5.0in,6.0in
set output "test_layout.png"
ROWS=3
COLS=2
set multiplot layout ROWS,COLS upwards
plot sin(4*x) # plot 4
plot sin(5*x) # plot 5
plot sin(2*x) # plot 2
plot sin(3*x) # plot 3
set size 1,(1.0/ROWS)
plot sin(1*x) # plot 1:
unset multiplot

只要第一(最后)行不同,此解决方案就可以工作,其他一切都遵循 nxm 方案。但是例如,您不能轻松地为第一行指定不同的高度。

$ gnuplot -d file.gp:

在此处输入图像描述

但是,我仍然对解决一般问题的其他方法感兴趣。

于 2013-04-09T15:28:21.803 回答
1

您可以从 matplotlib 获取几何图形。创建两个文件subplot2grid2gnuplot.pysubplot2grid.gptest.gp是一个使用示例。

subplot2grid2gnuplot.py

import matplotlib.pyplot as plt
import sys

if len(sys.argv)<6:
    sys.stderr.write("ERROR: subplot2grid2gnuplot.py needs 6 arguments\n")
    sys.exit(1)

shape = (int(float(sys.argv[1])), int(float(sys.argv[2])))
loc   = (int(float(sys.argv[3])), int(float(sys.argv[4])))
colspan = int(float(sys.argv[5]))
rowspan = int(float(sys.argv[6]))

ax = plt.subplot2grid(shape, loc, colspan, rowspan)
print "%f %f %f %f" % ax._position.bounds

subplot2grid.gp

# Return origin and size of the subplot
# Usage:
# call subplot2grid.gp shape1 shape1 loc1 loc2 colspan rowspan
# Sets:
# or1, or2, size1, size2

aux_fun__(shape1, shape2, loc1, loc2, colspan, rowspan) = \
   system(sprintf("python subplot2grid2gnuplot.py  %i %i %i %i %i %i %i", shape1, shape2, loc1, loc2, colspan, rowspan))

aux_string__= aux_fun__($0, $1, $2, $3, $4, $5)
or1=word(aux_string__,1)
or2=word(aux_string__,2)
size1=word(aux_string__,3)
size2=word(aux_string__,4)

测试.gp

unset xtics
unset ytics

set multiplot

call "subplot2grid.gp" 3 3 0 0 1 3
set size size1, size2
set origin or1, or2
plot sin(x)

call "subplot2grid.gp" 3 3 1 0 1 2
set size size1, size2
set origin or1, or2
plot sin(x)

call "subplot2grid.gp" 3 3 1 2 2 1
set size size1, size2
set origin or1, or2
plot sin(x)

call "subplot2grid.gp" 3 3 2 0 1 1
set size size1, size2
set origin or1, or2
plot sin(x)

call "subplot2grid.gp" 3 3 2 1 1 1
set size size1, size2
set origin or1, or2
plot sin(x)

unset multiplot

例子

于 2013-04-10T18:10:17.517 回答