Skip to content

布局与输出—多子图与图像导出

在实际科研中,常需在一张图上并排展示多个子图,以对比不同条件下的实验结果或展示数据的多个侧面。同时,图表的输出格式也至关重要:是用于网页预览的 PNG,还是用于论文投稿的高分辨率矢量图(如 PDF/EPS)?本期教程将带你掌握 Gnuplot 的版面布局与文件导出功能,使图表轻松满足各类出版要求。

一、多子图布局

Gnuplot 提供的 multiplot 模式允许我们在同一个画布上排列多个独立的图表。其基本用法如下:

bash
set multiplot
# 绘制第一个图
plot sin(x)
# 绘制第二个图
plot cos(x)
unset multiplot

上面的命令会将两个图表重叠在一起——这通常不是我们想要的效果。为了将它们排列成整齐的网格,我们需要在绘图前指定每个子图的位置和大小。

2×2 子图布局示例

以下脚本创建一个 2 行 2 列的矩阵布局,分别绘制不同的函数:

bash
set multiplot layout 2,2 rowsfirst
# 或者简写为:set multiplot layout 2,2

set title 'Plot 1: Sine'
plot sin(x) with lines

set title 'Plot 2: Cosine'
plot cos(x) with lines

set title 'Plot 3: x^2'
plot x**2 with lines

set title 'Plot 4: x^0.5'
plot sqrt(x) with lines

unset multiplot

layout 2,2 会自动将画布划分为 2 行 2 列的均匀网格,并依次填充子图。rowsfirst 表示按行优先顺序填充(默认),也可以使用 columnsfirst 按列优先。

更精细的控制

当自动布局无法满足微调需求(例如子图大小不一,或需要在子图间共享坐标轴标签)时,我们可以手动控制每个子图的大小和位置。

  • set size <x_scale>, <y_scale>:设置子图在画布上占据的相对宽度和高度(取值范围 0~1)。

  • set origin <x_pos>, <y_pos>:设置子图左下角在画布上的相对坐标(取值范围 0~1,原点位于画布左下角)。

例如,我们要创建一个上下排列的两个子图,上面子图高度是下面的两倍,可以这样实现:

bash
set multiplot

# 上方子图:高度 0.6,左下角位于 (0, 0.4)
set size 1, 0.6
set origin 0, 0.4
set title 'Large Top Plot'
plot sin(x)

# 下方子图:高度 0.4,左下角位于 (0, 0)
set size 1, 0.4
set origin 0, 0
set title 'Small Bottom Plot'
plot cos(x)

unset multiplot

技巧:在手动布局时,通常需要先关闭自动生成的颜色盒、图例等元素,以免干扰。可以使用 unset key 和调整边距命令(set lmarginset rmargin 等)来优化空间利用。

图像尺寸与比例

multiplot 模式下,整个画布的尺寸由当前终端(terminal)决定。因此,设置合适的画布大小是排版成功的关键。

  1. 设置画布大小

对于不同的终端,设置尺寸的方式略有不同:

  • PNG 终端set terminal pngcairo size 800,600 设置画布宽度 800 像素,高度 600 像素。

  • PDF 终端set terminal pdfcairo size 8cm,6cmsize 8,6(默认单位是英寸)。

  • 调整子图边距

有时子图之间的留白过大或过小,可以通过设置边距来微调:

  • set tmargin:顶部边距

  • set bmargin:底部边距

  • set lmargin:左边距

  • set rmargin:右边距

这些边距的单位取决于终端,通常为字符高度/宽度或点(pt)。例如,要减少两个垂直子图之间的空白,可以在绘制第二个子图前缩小上边距:

plain
set bmargin 2   # 设置底部边距为2个字符高度
set tmargin 1   # 设置顶部边距为1个字符高度

二、图像导出

图片输出格式

Gnuplot 的强大之处在于它支持多种输出格式。选择合适的格式取决于你的用途:网页预览通常使用位图(如 PNG),而论文投稿则必须使用矢量图(如 PDF、EPS、SVG)以保证缩放不失真。

Liii STEM 对此做了很好的支持,只需要进入对应的终端代码块,生成的图片自然就是对应的格式,

点击文件后右键,保存图形文件-Save image as...就可以将文件文件导出了~

保存与复用

不同于手动在 Gnuplot 交互环境中绘图,更好的做法是将所有绘图命令保存到.tmu文件中,下次直接打开该文件运行 Gnuplot 命令,不再受脚本的困扰,是不是很方便!

三、实战练习:包含多子图、精确布局与 PDF 输出的完整脚本

假设我们有四组实验数据,分别保存在 data1.datdata4.dat 中。

  • 文件 data1.dat(模拟正弦波)
plain
# X   Y
0.0   0.05
0.5   0.53
1.0   0.88
1.5   0.99
2.0   0.92
2.5   0.60
3.0   0.12
3.5  -0.35
4.0  -0.72
4.5  -0.96
5.0  -0.98
5.5  -0.74
6.0  -0.31
6.5   0.19
7.0   0.65
7.5   0.94
8.0   0.99
8.5   0.78
9.0   0.36
9.5  -0.13
10.0 -0.55
  • 文件 data2.dat(模拟余弦波)
plain
# X   Y
0.0   1.05
0.5   0.92
1.0   0.57
1.5   0.10
2.0  -0.37
2.5  -0.75
3.0  -0.96
3.5  -0.93
4.0  -0.68
4.5  -0.24
5.0   0.22
5.5   0.68
6.0   0.94
6.5   0.95
7.0   0.71
7.5   0.28
8.0  -0.19
8.5  -0.62
9.0  -0.91
9.5  -0.99
10.0 -0.78
  • 文件 data3.dat(模拟衰减振荡)
plain
# X   Y
0.0   0.02
0.5   0.43
1.0   0.70
1.5   0.72
2.0   0.56
2.5   0.31
3.0   0.03
3.5  -0.21
4.0  -0.34
4.5  -0.36
5.0  -0.28
5.5  -0.15
6.0   0.01
6.5   0.14
7.0   0.21
7.5   0.19
8.0   0.11
8.5   0.01
9.0  -0.08
9.5  -0.12
10.0 -0.11
  • 文件 data4.dat(模拟抛物线)
plain
# X   Y
0.0   1.53
0.5   1.28
1.0   1.06
1.5   0.88
2.0   0.72
2.5   0.59
3.0   0.47
3.5   0.36
4.0   0.24
4.5   0.12
5.0  -0.02
5.5   0.10
6.0   0.22
6.5   0.35
7.0   0.49
7.5   0.65
8.0   0.84
8.5   1.05
9.0   1.29
9.5   1.53
10.0  1.52

我们希望将它们排列成 2×2 的网格,共享相同的 x 和 y 范围,并输出为可投稿的 PDF 文件。

bash
# 全局坐标轴设置
set xrange [0:10]
set yrange [-1.5:1.5]
set grid

# 进入 multiplot 模式,手动布局 2x2
set multiplot

# ---------- 左上 ----------
set size 0.5, 0.5
set origin 0.0, 0.5
set title 'Sample 1'
unset xlabel   # 内部子图隐藏轴标签
unset ylabel
plot 'data1.txt' with linespoints lt 1 pt 7 title ''

# ---------- 右上 ----------
set size 0.5, 0.5
set origin 0.5, 0.5
set title 'Sample 2'
plot 'data2.txt' with linespoints lt 2 pt 5 title ''

# ---------- 左下 ----------
set size 0.5, 0.5
set origin 0.0, 0.0
set title 'Sample 3'
set xlabel 'X axis'   # 只在左下和右下显示 x 轴标签
set ylabel 'Y axis'
plot 'data3.txt' with linespoints lt 3 pt 9 title ''

# ---------- 右下 ----------
set size 0.5, 0.5
set origin 0.5, 0.0
set title 'Sample 4'
set xlabel 'X axis'
unset ylabel   # 右列隐藏 y 轴标签避免重叠
plot 'data4.txt' with linespoints lt 4 pt 11 title ''

unset multiplot

运行此脚本后,你将得到一个四合一的高质量 PDF 图表。