Appearance
布局与输出—多子图与图像导出
在实际科研中,常需在一张图上并排展示多个子图,以对比不同条件下的实验结果或展示数据的多个侧面。同时,图表的输出格式也至关重要:是用于网页预览的 PNG,还是用于论文投稿的高分辨率矢量图(如 PDF/EPS)?本期教程将带你掌握 Gnuplot 的版面布局与文件导出功能,使图表轻松满足各类出版要求。
一、多子图布局
Gnuplot 提供的 multiplot 模式允许我们在同一个画布上排列多个独立的图表。其基本用法如下:
set multiplot
# 绘制第一个图
plot sin(x)
# 绘制第二个图
plot cos(x)
unset multiplot
上面的命令会将两个图表重叠在一起——这通常不是我们想要的效果。为了将它们排列成整齐的网格,我们需要在绘图前指定每个子图的位置和大小。
2×2 子图布局示例
以下脚本创建一个 2 行 2 列的矩阵布局,分别绘制不同的函数:
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,原点位于画布左下角)。
例如,我们要创建一个上下排列的两个子图,上面子图高度是下面的两倍,可以这样实现:
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 lmargin、set rmargin等)来优化空间利用。
图像尺寸与比例
在 multiplot 模式下,整个画布的尺寸由当前终端(terminal)决定。因此,设置合适的画布大小是排版成功的关键。
- 设置画布大小
对于不同的终端,设置尺寸的方式略有不同:
PNG 终端:
set terminal pngcairo size 800,600设置画布宽度 800 像素,高度 600 像素。PDF 终端:
set terminal pdfcairo size 8cm,6cm或size 8,6(默认单位是英寸)。
- 调整子图边距
有时子图之间的留白过大或过小,可以通过设置边距来微调:
set tmargin:顶部边距set bmargin:底部边距set lmargin:左边距set rmargin:右边距
这些边距的单位取决于终端,通常为字符高度/宽度或点(pt)。例如,要减少两个垂直子图之间的空白,可以在绘制第二个子图前缩小上边距:
set bmargin 2 # 设置底部边距为2个字符高度
set tmargin 1 # 设置顶部边距为1个字符高度二、图像导出
图片输出格式
Gnuplot 的强大之处在于它支持多种输出格式。选择合适的格式取决于你的用途:网页预览通常使用位图(如 PNG),而论文投稿则必须使用矢量图(如 PDF、EPS、SVG)以保证缩放不失真。
Liii STEM 对此做了很好的支持,只需要进入对应的终端代码块,生成的图片自然就是对应的格式,

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

保存与复用
不同于手动在 Gnuplot 交互环境中绘图,更好的做法是将所有绘图命令保存到.tmu文件中,下次直接打开该文件运行 Gnuplot 命令,不再受脚本的困扰,是不是很方便!
三、实战练习:包含多子图、精确布局与 PDF 输出的完整脚本
假设我们有四组实验数据,分别保存在 data1.dat 到 data4.dat 中。
- 文件
data1.dat(模拟正弦波)
# 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(模拟余弦波)
# 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(模拟衰减振荡)
# 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(模拟抛物线)
# 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 文件。
# 全局坐标轴设置
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 图表。

