使用 Gnuplot 和 Xmgr 绘图

作者:Andy Vaught

数据绘图是计算机最古老的用途之一,可以追溯到 FORTRAN 程序在线式打印机上生成字符图形。幸运的是,情况已经有所进步,现代计算机能够生成更美观的图形。Linux 下有几个用于 X 和 SVGALIB 的绘图软件包可用。其中两个最突出的软件包是 gnuplot 和 xmgr(也称为 ACE/gr)。Xmgr 侧重于外部生成数据集的绘图和操作,而 gnuplot 更多用于绘制数据和数学函数。

Gnuplot 的主要作者是 Thomas Williams 和 Colin Kelley,还有许多其他人做出了贡献。尽管 gnuplot 是独立于自由软件基金会编写的,但 FSF 确实分发它。Gnuplot 的编写考虑了可移植性,在十几个操作系统下支持大约四十几种输出设备和格式。在 Linux 下,它可以在 X 和 SVGALIB 下运行。修改 gnuplot 以支持新设备需要编写一些与设备相关的子程序,这些子程序与主程序链接在一起。

另一方面,Xmgr 与 X 绑定。由 Paul Turner 开发,它也在 Linux 以外的许多平台上运行,但它仅输出 PostScript。在开发的后期阶段,Linux 是主要的开发平台。最近,开发已经分散到一个由感兴趣的人组成的松散组织。

Gnuplot

Gnuplot 具有命令行界面,其中混合了类似于 bash shell 的 emacs 和 Unix 命令行编辑。Gnuplot 可以在批处理模式下运行,其中命令取自文件。plot 命令使绘图被发送到当前选择的设备。对于 Linux svgalib 驱动程序,选择图形模式,并在当前虚拟控制台中绘制图形。当按下键时,显示器更改回文本模式以进行附加命令。在 X 下,为图形创建一个新窗口,而命令在原始 shell 窗口中输入。

Gnuplot 具有全面的在线帮助功能,可以通过键入 help 来访问。基本的 help 命令按主题列出 help 命令的参数。某些主题(如 set 命令)有许多子主题。文档本身写得很好,并且有许多有价值的工作命令示例。

包含要绘制的点的 datafile 由单引号或双引号中的文件名标识。每行有两个或多个空格分隔的数字,这些数字对应于要绘制的点。例如,假设我们有一个名为“hits”的文件

# Monthly hits on our web site
1   13
2   23
3   66
4   75
5   74
6   82
7   377
8   442
9   512
10  756
11  874
12  946

命令 plot "hits" 将绘制名为 hits 的文件中的数据的图形。数据文件中以 # 字符开头的行被视为注释行。空行不被视为注释。相反,它们指示不应在点对之间绘制线的位置。

尽管我们的示例在第一列中列出了 x 数据,在第二列中列出了 y 数据,但 gnuplot 可以处理并非如此的情况。命令

plot "hits" using 2:1

将导致从第二列读取 x 数据,并从第一列读取 y 数据。

可以以多种方式修饰绘图。每个逗号分隔的文件或数学表达式(稍后显示)都有两个可以由用户指定的属性:标题和样式。gnuplot “title”是一个字符串,它与标记该数据的绘图样式的示例一起显示;这通常被其他程序称为“图例”。绘图的样式是从几种可能的样式中选择的,包括“points”,它在每个数据点显示一个符号,“lines”,它在点之间绘制线,以及“linespoints”,它同时绘制线和符号。线和符号的颜色以及符号的类型(加号、叉号、框)通常由 gnuplot 依次分配以使每个都不同,但用户可以覆盖这些。

例如,命令 plot "hits" title '网站点击量' with linespoints 3 4 使用类型 3 的线和类型 4 的点绘制我们的数据文件。在右上角将是字符串 网站点击量,旁边是类型 3 的线和类型 4 的点的简短示例。您实际看到的内容取决于正在使用的输出设备——彩色显示器上的彩色线条在单色设备(如大多数 PostScript 打印机)上可能会变成虚线和点线。

我们的绘图看起来更好了,但仍然不完美。我们想在 x 轴和 y 轴上放置标签,以进一步向读者暗示我们正在看什么。轴标签是可设置的参数,图形标题也是如此

set xlabel "Month"
set ylabel "Hits"
set title "Hits on the Website"
replot

在 gnuplot 中进行实验很容易,可以使用 replot 命令,该命令重复上一个绘图命令。这不仅节省了击键次数,而且作者的一个朋友喜欢重复键入 replot 来显示另一个作业正在附加到的文件,这给出了正在计算的结果的运行显示。

我们的图形几乎完成了。Gnuplot 的默认算法用于决定 x 刻度线出现的位置,仅显示每隔一个 x 点。我们可以通过以下方式使其显示所有刻度线

set xtics 1, 1
replot

第一个数字使刻度线从 x=1 开始,第二个数字使它们间隔一个单位。我们可以包含第三个逗号分隔的参数来指示最后一个刻度线应绘制在哪里,但在我们的示例中没有必要。

我们可以做得比月份数字更好

set xtics ("Jan" 1, "Feb" 2, "Mar" 3, "Apr" 4,
    "May" 5, "Jun" 6, "Jul" 7, "Aug" 8, "Sep" 9,
    "Oct" 10, "Nov" 11, "Dec" 12)
replot

我们已经得到了一个值得向老板展示的图形。结果如图 图 1 所示。

剩下的就是打印出来。Gnuplot 将打印机和绘图仪视为另一个输出设备。执行命令

set terminal PostScript

告诉 gnuplot 生成图形的 PostScript 而不是控制台图形。仅仅设置终端类型是不够的。现在键入 replot 将导致 gnuplot 将 PostScript 输出到用户终端。命令

set output "graph.ps"
replot

将导致 PostScript 被发送到文件 graph.ps。如果文件名的第一个字符是竖线,则 gnuplot 将字符串的其余部分解释为程序,该程序将接受 gnuplot 的输出作为其标准输入。因此,像这样的命令

set output "|lp"
replot

将输出发送到系统的默认打印机。

数学函数的绘图很容易生成:plot 2*x 将生成一条斜率为 2 的线的绘图,其默认范围为 -10.0 到 +10.0。y 轴默认情况下会自动缩放,以便所有点都可见。对于数学函数,x 范围取自默认范围。可以覆盖多个绘图,不同的表达式用逗号分隔。

各种常见的数学函数都可以在表达式中使用——三角函数、指数函数和对数函数,以及不太常见的函数,如贝塞尔函数和误差函数。表达式主要基于 C 风格的表达式,包括逻辑 AND (&&) 和 OR (||) 运算符,以及值得注意的 FORTRAN 幂运算符 (**)。

范围由方括号括起来的冒号分隔的一对数字指定。可以省略任一或两个数字以避免影响当前默认值。第一个数字指定范围的开始,第二个数字指定范围的结束。如果我们想查看具有相同范围的几个图形,可以使用命令 set xrange [1:2] 更改默认范围。如果我们只想在一个绘图中更改范围,则可以在要绘制的第一个函数之前指定范围。

高级 Gnuplot

可以使用 splot 命令生成三维曲面,该命令的语法与 plot 几乎相同。附加范围指定 y 变量的范围,set view 命令允许用户控制绘图在空间中的方向。一个简单的例子是

splot x*x-y*y title "Hyperbolic Paraboloid"

Gnuplot 还支持隐藏在其他线条后面的线条,使用 hidden3d 参数:set hidden3d

Gnuplot 可以绘制“参数”函数。参数函数是 x 和 y 坐标都是第三个变量的函数,在 Gnuplot 中是 t。例如

set parametric
plot 2*sin(t), 2*cos(t)

生成半径为 2 的圆。命令

set trange <range>

设置要评估的 t 值。参数绘图在执行三维 splot 时也有效。在这种情况下,gnuplot 下的自变量是 u 和 v。

Gnuplot 还可以从 Unix 命令的标准输出中获取数据点,该命令在 gnuplot 的命令行中指定。这允许显示从几乎任何来源生成的点。命令应像文件名一样指定,前面加一个 < 字符。

Xmgr

Xmgr 更侧重于绘制从外部源创建的数据,而不是绘制给定的数学函数。Xmgr 通常读取文件,但也可以从其标准输入中获取管道输入。一旦数据被读入 xmgr 集,就可以以多种方式显示、缩放和操作。

Xmgr 也有在线帮助。当选择“help”菜单时,xmgr 使用 xmgr 文档作为输入运行您最喜欢的 HTML 浏览器(默认情况下为 Mosaic)。互联网上的几个站点都有此页面在线。如果您没有浏览器,则最终必须读取原始 html。将程序的文档作为超文本文件非常好,因为您可以从一个主题跳转到另一个主题,并且能够进行文本搜索。xmgr 发行版中还包含 xmgr 生成的图形库,它使用户可以直观地了解 xmgr 可能实现的各种效果。

绘制一些数据的第一步是将数据读入 xmgr。“File”下的“Read Sets...”选项生成一个文件浏览器,可以从中选择文件。可以读入几种类型的数据,但两列“XY”格式是最常见的。数据的格式与 gnuplot 中的格式非常相似——线条上的单个点用空格或制表符分隔。以 # 开头的行也被视为注释行,而不包含数字数据的行(如空行)分隔集。以 @ 符号开头的行可以独立于用户控制 xmgr 的操作。

Xmgr 数据集有点像寄存器,因为只有固定数量可用(在编译时固定),并且它们按编号引用。一旦数据进入一个集,它会立即显示。xmgr 窗口的左侧包含许多按钮,这些按钮为各种操作提供快捷方式。

大多数快捷按钮允许用户交互式地更改图形的外观。一组四个箭头按钮在所有四个方向上滚动数据——刻度线和刻度线标签会自动更新。“Z”和“z”按钮允许均匀地放大和缩小。任意放大可以通过使用放大镜按钮来完成。这会提示用户输入一个矩形,该矩形将成为图形的新限制。xmgr 窗口顶部的文本行不断显示鼠标的当前位置,以图形的坐标表示。可以切换一个延伸窗口长度和宽度的十字准线,以帮助将鼠标定位在所需点的像素内。

“autoO”按钮提供自动缩放功能。光标变为十字准线,当在某一点单击时,它会选择最接近单击点的集。图形会重新缩放,以便此集中的所有点都可见。“autoT”按钮立即重新缩放刻度线,刻度线在缩放时可能会变得拥挤。

每个数据集都有几个属性,这些属性控制数据集的显示方式——哪个符号用于点、符号的颜色、符号是否由线条连接、线条的颜色和样式、与数据集关联的图例等等。一个相当拥挤的菜单控制所有这些选项。

用户可以很好地控制图形的显示方式。可以覆盖 xmgr 选择的主刻度和副刻度线。可以在任意位置绘制简单的框和线条图形以及文本字符串。所有字符串都可以以各种字体和大小显示,并提供下标、上标和一些特殊字符。

为了重复使用 gnuplot 的早期示例,图 2 显示了加载 hits 文件后立即显示的 xmgr 显示。图 3 显示了用于控制集的外观和集的图例的符号和图例菜单,而 图 4 显示了结果。图 5 显示了我们准备通过用月份名称替换数字来修复 X 轴,结果在 图 6 中。图 7 是在最后润色之后,添加标题,给 Y 轴命名,去掉刻度线标签中的十分位数字,并将 X 轴扩展到填充图形的整个底部。图 8 是最终的 PostScript 输出。

高级 Xmgr

一旦数据进入内部集,就可以通过多种方式进行操作。可以编辑、删除和保存集。可以键入任意数学函数以将一个集转换为另一个集。可以对各种标准曲线(多项式、对数和指数)进行回归,有时称为“曲线拟合”。可以从具有用户可定义 bin 宽度的集创建直方图。支持许多其他数学运算。可以保存和加载各个数据集(以及完整的图形)。

Xmgr 还允许用户定义“区域”,这些区域作为由鼠标单击确定的多边形输入。区域内的数据点可以从数据集提取到其他数据集,也可以从数据集中删除。回归选项也可以设置为仅在特定区域的内部或外部操作。

更多信息

Gnuplot 有自己的 Usenet 新闻组 comp.graphics.gnuplot。当前版本为 3.5。Gnuplot 可以从 Gnu ftp 站点(如 prep.ai.mit.edu)及其镜像站点下载。

gnuplot 3.5 发行版附带一个用 LaTeX 编写的教程。常规 gnuplot 文档可以编译成几种不同的格式,其中一种格式是在线帮助文件。其他格式是 VMS .hlp 文件、TeX 文档、nroff/troff 格式和 .rtf 富文本格式。还提供了一个 man 页面,其中介绍了调用选项和使用的 X 资源。

xmgr 的当前版本为 3.01。Xmgr 的主页位于 www.teleport.com/~pturner/acegr/index.html。FAQ、在线文档、源代码和二进制文件都在那里。其他页面仍然有一些指向旧 xmgr 主页 ogi.edu 的悬空指针,邮件列表仍托管在那里。

Andy Vaught (ayndy@maxwell.la.asu.edu) 目前是亚利桑那州立大学的物理学研究生,并在摩托罗拉兼职工作。在不登录时,他喜欢骑自行车、滑雪和高尔夫。他还积极参与民用航空巡逻队。

加载 Disqus 评论