gnuplot 让您的数据可视化

Gnuplot 是一种免费分发的绘图工具,能够移植到各类主流平台。它能够下列两种模式之一进行操做:当须要调整和修饰图表使其正常显示时,经过在 gnuplot 提示符中发出命令,能够在交互模式下操做该工具。或者,gnuplot 能够从文件中读取命令,以批处理模式生成图表。例如,若是您正在运行一系列的实验,须要每次运行后都查看结果图表;或者当您在图表最初生成好久之后须要返回图表修改某些内容时,批处理模式能力会特别有用。当在 WYSIWIG 编辑器中很难捕获用于修饰图表的鼠标单击事件时,您能够很容易地将 gnuplot 命令保存在文件中,六个月后将其加载到交互式会话中从新执行。 html

Gnuplot 是在 1986 年由 Colin Kelley 和 Thomas Williams 最初开发的。许多参与者都在为不一样的“终端”建立变种方面作出了贡献。在 1989 和 1990 年,这些变种被合并到 gnuplot 2.0 中。2004 年 4 月,发布了 4.0 版本。本教程将适用于 4.0 版本,可是这里介绍的大多数命令应该也适用于其余版本。在适当的地方,我将说起其中的主要区别。 参考资料中列出了 gnuplot 的官方 Web 站点。 linux

下面,咱们为初学者提供了实践指南;可是即便您之前有一些 gnuplot 的经验,您也可能会在 4.0 版本中发现新的惯例和命令。咱们从简单的正弦曲线开始,将其定制为咱们所但愿看到的形状。而后咱们将研究如何绘制一组数据点。在本文中,咱们仅限于 2D 绘图,由于它们是最多见的。 shell

GNG:Gnuplot 不是 GNU

虽然它的名称可能意味着其余方面,但 GPL 不包含 gnuplot。对于法律方面,gnuplot FAQ #1.7 指出:“从您没必要为其付钱方面来说,Gnuplot 是免费软件。不过从您不能免费分发 gnuplot 的修改版本方面来说,它又不是免费软件。请阅读和接受发行版中的版权文件。”安全

初学用户时常可以很好地想出他们的图表形状,可是不知道须要使用什么 gnuplot 命令。因此了解 gnuplot 的关键是很好地掌握它的词汇表,其他应该凭足够的直觉。在本教程中,我仅能对您将在 gnuplot 中充分使用的通用选项提供一个了解;本教程并非毫无遗漏的。因此,例如,我告诉您如何设置 x 范围来限制图表中 x 轴的范围。设置 y 范围与 x 范围类似(在命令中使用 yrange,而不是 xrange ),但我将再也不讨论。 electron

基础编辑器

经过在 shell 命令提示符中输入 gnuplot 启动 gnuplot。您首先看到提示符号 > 。该提示符是进入 gnuplot 的输入点;Linux 用户将习惯于这种方式。例如,您可使用方向键来查找之前输入的命令历史记录,而后编辑和从新执行这些命令;Home 和 End 键与平时使用没有区别。能够对 gnuplot 进行从新编译以便使用 GNU readline 库在输入提示符上来回移动,但相似于默认函数。 ide

Gnuplot 提供了普遍的在线帮助,若是您要作任何有用的事情,则确定会用到这些在线帮助。语法是统一的:经过输入 help <command> 能够得到任何命令的帮助。接着启动 gnuplot,尝试命令 help set yrangehelp set(在每一个命令以后,使用 q 退出帮助)。注意 yrangehelp set 下的可用子选项之一。通常来讲,gnuplot 帮助为命令的全部可能定制提供进一步的帮助。浏览帮助中的示例部分一般就足能够了解如何使用命令。 函数

Gnuplot 还有大量展现其能力的演示,一般位于安装的演示子目录中。为了得到这些能力,在 gnuplot 提示符下进入此目录中(例如, cd '/opt/gnuplot/demo' — 注意 gnuplot 要求全部文件名和目录名都用单引号或双引号括起来),而后输入 load 'all.dem' 。该目录中的各个 .dem 文件演示了各个函数,all.dem 将它们一次所有加载。但您可能想将此操做延迟到本文结束时进行,这样咱们能够开始使用 gnuplot ,无需再进行其余操做... 工具

对于那些想要继续的人,能够在提示符中分别输入代码清单中的每行代码。或者,将整个清单保存到一个临时文件中,而后经过在 gnuplot 提示中输入 load 'filename' (不要忘记引号)来运行代码。 post

能够预见的是,2D 绘图的命令是 plot 。在提示符中输入 plot sin(x) :您应该在弹出窗口中看到熟悉的正弦曲线。


图 1. sin(x)
图 1. sin(x)

咱们刚刚建立了多是最简单的图。让咱们看看如何以不一样方法定制该图。假设咱们只想看到一个正弦曲线周期。咱们经过限制图的默认 x 范围来完成此操做。使用表示法 [min:max] 来指定范围。要仅指定最小值,使用 [min:];要仅指定最大值,使用 [:max]。数学上称此为所谓的“闭”区间表示法。

这里咱们使用 [-pi:pi] 获得一个正弦曲线周期:


清单 1. 从 -pi 到 +pi 的 sin(x)
set xrange [-pi:pi]
replot
reset


图 2. 重绘正弦曲线图
图 2. 重绘正弦曲线图

咱们刚才使用了 replot 命令,它执行先前的 plot 命令。当您绘制曲线图且须要不断对该图进行修改以添加想要的特征时,此命令会很是有用。另外,replot 使您能够添加更多的图。尝试输入 replot cos(x)。依照语法,该命令等同于 plot sin(x), cos(x) 。Replot 就是获取先前的绘图字符串,添加必要的逗号,而后附加输入给它的其他部分。

使用的最后一个命令 reset 对于绘制正弦曲线不是必要的。它移除先前全部 set 命令的效果并恢复默认值。所以,在本例中,它将使用默认 x 范围。

如今让咱们尝试一些更奇特的东西: plot sin(x)/x 。您应该看到以下所示图形:


图 3. sin(x)/x
图 3. sin(x)/x

从刚才这三个简单的例子,您能够看到 gnuplot 可以理解 pi 并具备丰富的自带数学函数词汇表。它甚至知道很是有用的管理正态分布的统计函数,以及深奥的特殊函数,如朗伯、贝塞尔、beta 和 gamma 函数(还有更多!),这些函数一般仅在 mathematica 等功能齐全的数学工具中才会有。根据经验,语法与 C 中的语法类似,C 中的语法又与日常数学中使用的语法类似。(一个重要的不一样是指数的表示法:为了方便,x 的 y 次幂写为 x**y )。

接着,将图命名为(“My First Graph”),并命名轴(x 轴是“angle, in degrees”,y 轴是“sin(angle)”)。


清单 2. 命名图和轴
set title "My first graph"
set xlabel "Angle, \n in degrees"
set ylabel "sin(angle)"
plot sin(x)

注意 xlabel 中的 \n 会产生新的一行。通常来讲,gnuplot 在双引号内的字符串中进行相似于 C 的反斜杠处理。Windows 用户注意:若是您想文件名使用双引号括起来的字符串表示,则必须使用两个反斜杠:如 "c:\\developerworks" (或者可使用一个正斜杠: "c:/developerworks" )。

如今,咱们注意到 x 轴实际没有标记为度数,看起来不是很好。要修改此问题,经过调整 x 轴上的 tic 标记,使指定的(主)标记仅以 90 度增长和辅标记以 45 度增长。主 tics 的“级别”为 0,这是默认值;辅 tics 的级别为 1。每一个点分别由一个 3 元组指定: "label" (放在引号中)、 <point-at-which-tic-is-made><optional-level>


清单 3. 改变轴上 tic 并设置网格
set xrange [-pi:pi]                       # we want only one cycle
set xtics ("0" 0, \
	        "90" pi/2, "-90" -pi/2, \
			"" pi/4 1, "" -pi/4 1,  \
			"" 3*pi/4 1, "" -3*pi/4 1)
set grid
set xlabel "Angle,\n in degrees"
set ylabel "sin(angle)"
plot sin(x)


图 4. 带有 tics、标题、网格和标签的轴的 sin(x)
图 4. 带有 tics、标题、网格和标签的轴的 sin(x)

注意对 +45 度和 -45 度辅标记使用了空标签 ("")。还要注意咱们没必要以任何顺序列出点。像 gnuplot 中的其余全部项同样, xtics 命令功能很是多,具备方便的选项,用于以固定增量建立 tic 标记(在对数标度中为正常倍数),以及用于时间相关数据的特殊格式。查看 help set xtics 中的例子能够得到更多信息。

做为边注,注意咱们使用反斜杠将 xtics 命令扩展成多个输入行。这样可使比较长或比较复杂的命令更易读懂。

咱们还用 set grid 来设置网格,该命令使您能够从数量上查看图。到如今为止,咱们大量地使用了 set 命令。Gnuplot 有一种撤销设置的统一方法:在 gnuplot 4.0 中,命令是 unset。例如,若是您不想要网格,使用 unset grid 。4.0 之前的版本,命令是 set nogrid

顺便说一下,咱们提供的全部例子均可以在交互模式或批处理模式下运行。要以交互模式运行,在提示符中输入每一个命令。要以批处理模式运行,将命令输入或添加到文本文件中,而后在 gnuplot 提示符中使用 load 'filename' 读入文件,或者在 shell 提示符下将其做为参数提供给 gnuplot: $ gnuplot filename 。使用第二种方法,gnuplot 会在执行输入文件中的全部命令后退出,因此当直接绘图到文件中(请参见下一节)时,采用批处理模式执行特别有效。若是在屏幕上绘图时使用第二种方法,输出窗口一出现(当 gnuplot 退出时)就会消失,因此您须要使用显式的“pause -1”命令(请参阅 help pause )来保持窗口。

批处理模式操做中使用的 Gnuplot 命令文件每每停留一会,从而帮助使用注释来提升可读性。 # 后面的直到行结束的内容是注释。因此在示例清单 3 中,gnuplot 不处理 we want only one cycle

回页首

终端设备 —— 题外话

在启动时,您可能注意到终端类型设置为 X11。Gnuplot 采用标准设计,能够在多个终端设备上绘图。这包括直接打印到多种打印机中,包括 Epson、HP 和 Imagen 打印机。它甚至能够在伪设备中绘图,如 postscript 和 png。这主要涉及生成输出文件,而不是可查看文件或打印输出。这是将您的图表包含在其余报表中的一种技巧。虽然我尚未发如今 Windows 中与在 Linux 中有什么不一样,本文档建议您在设置输出文件名以前先设置终端类型:


清单 4. 设置输出和终端类型
set terminal png         # gnuplot recommends setting terminal before output
set output "output.png"  # The output filename; to be set after setting
		 	 # terminal
replot

如今,文件 output.png 中有了您刚才绘制的图,且能够包含在一个更大的报表中。许多广泛使用的排版和制图程序都有专门的终端,这些程序包括 Adobe Illustrator( set term aifm )、Corel Draw( set term corel)、AutoCad( set term dxf )和多种 LaTex 相关的终端( eepiclatexpstrickstexdrawtpic 等等)。您还能够获得 PostScript、enhanced PostScript (eps) 或 Adobe PDF 格式的文件。您的 gnuplot 版本可能没有编译全部的终端驱动程序 —— 例如,Windows 用户不须要 Xll 终端,Linux 用户不须要 Windows 终端。相似地,出于法律缘由,gnuplot 4.0 移除了对 gif 终端的支持。

全部终端在能力上都不相同。其中的一些(如 LaTeX)可能不支持文本的旋转,因此若是您像咱们前面那样设置 ylabel,在不一样的终端中可能显示不同。换句话说,您能够在 LaTeX 的特定终端中使用 LaTex 命令。例如, set ylabel "$sin(\\theta)$"(注意咱们使用两个反斜杠产生一个 LaTex 所需的反斜杠 —— gnuplot 在将双引号中所括的字符串传送到终端驱动程序以前,先对其进行反斜杠处理)。如今,您可使用 \input{output.tex} 将输出文件包含在 LaTeX 文件中。要在 PostScript 终端中得到相同的结果,使用相应的 PostScript 命令: {/Symbol q} 。在 enhanced PostScript 和 LaTeX 中,您可使用表示法 x^{superscript}x_{subscript} 获得上标文字。还要注意缩写的终端和输出命令:


清单 5. eps 驱动程序的能力
set term post enh  		 # enhanced PostScript, essentially PostScript
 		 		 # with bounding boxes
set out 'gplt.eps'
set xlabel '{/Symbol q_1}
set ylabel 'sin^2({/Symbol q_1})'
plot sin(x)**2

参考资料部分的代码补充说明包含具备以上命令的 TeX 文件示例。

鼠标支持

版本 4.0 提供了新的功能,Windows 和 X11 终端支持鼠标交互。鼠标支持有两个主要用途:坐标跟踪和缩放。鼠标指针的当前坐标显示在终端窗口的左下角。经过双击第一个鼠标按钮能够将其复制到剪贴板中。当您须要设置须要直接坐标的标签或箭头时,此操做会很是有用。(使用 help arrowhelp label 能够得到这些命令的更多详细信息。)还能够拖动第二个(或右击)鼠标按钮来选择要放大的矩形区域。在 3D 绘图中,您能够拖动鼠标来旋转图像(按住 Ctrl 键将仅更改轴的视图;因此对于要用很长时间才能呈现的图,能够先更改轴,而后放开 Ctrl 键来从新呈现图)。

鼠标支持还支持一组有用的热键:若是先前对图进行了放大, u则取消访大。 g切换网格, l切换坐标轴上的刻度; L切换最靠近指针的最标轴上的刻度, r切换标尺,标尺会创建任意原点。启用了标尺后,屏幕的底部显示当前坐标指针距离标尺原点的 x 轴距离和 y 轴距离以及距离实际原点的 x 轴和 y 轴距离(与点的坐标相同)。在 3D 中,方向键能够用在鼠标拖拉的地方来旋转图像。空格键激活命令窗口, q退出终端窗口。要查看全部选项,在支持鼠标的终端中输入 h

控制比例和长宽比

默认状况下,gnuplot 对 x 轴和 y 轴都使用比例系数 1,可是它对控制图形的长宽比(y 轴长度与 x 轴长度的比率)不起做用。终端驱动程序使用终端的默认长宽比。比例系数、长宽比或者二者均可以使用 set size 命令指定,例如:

# square is synonymous to an aspect ratio of 1;
# scale y-axis by 2, retain x-axis size
set size ratio square 1,2

gnuplot 使用给定的长宽比可否成功绘制图可能受到终端能力的限制。 set size 也是与 multiplot 命令一块儿使用才有用,multiplot 命令用于在同一输出屏幕或文件中生成多个图。

回页首

绘制多条曲线

正如精明的读者可能已经从上面关于 replot 的注释中推测到的,gnuplot 使您能够同时画多条线。假设咱们同时绘制正弦和余弦曲线。简单的 plot 命令为 plot sin(x), cos(x);要画的曲线以逗号分隔。若是再也不指定其余项,gnuplot 自动显示两个曲线图,从而它们能够互相区别 —— 在诸如 Windows 和 Xll 的终端中,gnuplot 使用不一样的颜色。单色终端使用不一样种类的线显示曲线图。经过查看图例(或键),您应该可以知道图中的线分别是何种曲线。gnuplot 还容许您指定绘图的样式,以便得到进一步的控制:

unset xtics # keep all other things simple
plot sin(x) with linespoints pointtype 5, cos(x) w boxes lt 4


图 5. 多条曲线
图 5. 多条曲线

with 子句(请参阅 help plot with ,若是使用版本 4.0,还有 help plotting styles )使您能够详细而精确地指定线的样式。在本例中,咱们说明两种有用的样式。第一种样式 linespoints 一般在对数据绘图时很是有用,它在涉及的每一个示例或数据点处标记一个点,并使用线性插值法链接连续的点。这里咱们另外指定点类型为 5,它选择终端容许的第五种点。第二种样式 boxes 更适合绘制直方图数据。注意咱们如何在 cos(x) 曲线中将 with 缩写成 w 。相似地, lt是 linetype 的缩写,是另外一个特定于终端的设置,它选择终端能够绘制的四种线。没必要说(什么,您尚未尝试 help plot with吗?),您可使用 pt 代替冗长的 pointtype。若是想在多条线中使用相同的绘图样式(在一个 plot 命令中或在多个 plot 命令中),可使用 set 命令设置绘图样式。在 gnuplot 4.0 中,使用 set style function linespoints ;之前的版本使用语法 set function style boxes。要更改用于绘制与函数相对的数据集合的样式,使用 set style data linespoints(之前的版本使用 set data style linespoints )。

gnuplot 如何工做

除了趣味性,本次练习显示了 gnuplot 实际如何对函数绘图 —— 它获取多个样本并在每一个样本点绘制值。一般,它会在这些点间平滑地插入值;使用 boxes 样式则强制它使用平面的直方图,linespoints 样式用一个点标记每一个样本。要更清楚地观看,显式地将采样比率设为 10( set samples 10 )并从新绘图。(而后将其设置会默认值 100)。

with 子句是咱们使用除了 set 以外的其余项来定制图的第一个例子。一些其余广泛使用的选项也能够直接在 plot 命令中设置。例如,还能够设置 xrange: plot [-pi:pi] sin(x)。对默认绘图选项的快速而随意的一次性更改则使用此类语法。要在多个图中或在多个 plot 命令中从新使用,须要使用 set 命令。

当绘制两条或多条曲线时,咱们须要关键字或图例来对它们进行区分。默认状况下,关键字在右上角;可是若是它妨碍了图,能够将关键字放到其余位置 —— 若是愿意,甚至能够放到图外。下面的代码片断将关键字放在了左上角,并在它周围设置了一个框。咱们还经过在 plot 命令中给定明确的标题来控制图例中为曲线提供的名称。title 能够缩写为 t,正如咱们对余弦曲线的设置。若是不想在图例中命名曲线,使用 notitle ,而不是 title 。最后一点,也是新用户常常出错的地方就是若是有标题,标题必须放在 with 子句的前面:


清单 6. 定制图的关键字或图例
set key top left
set key box
plot [-pi:pi] sin(x) title "sinusoid" with linespoints pointtype 5, \
cos(x) t 'cosine' w boxes lt 4


图 6. 定制关键字
图 6. 定制关键字

在同一屏幕上绘制相关的图

上面,咱们在同一图中绘制了正弦和余弦曲线。Gnuplot 使您还能够绘制多个图,这样它们能够并排显示在同一输出屏幕或文件中。在某些排版系统中,以一个文件的形式包含两个图形比分别包含两个图形要更容易。

下面是简单说明的 multiplot ,它绘制正弦、余弦及其各自倒数的曲线图。基本方法是将屏幕或图像文件的边框比例设为 1。而后,咱们绘制不一样的曲线图,从而它们能够每一个图占据屏幕的四分之一。咱们还经过使用屏幕坐标(请参阅 help coordinates ,得到关于不一样类型坐标系统的讨论)设置原点来控制曲线图显示的位置。另外,注意每一个 plot 还自动计算轴、tic 等等的宽度 —— 这样您可能必须调整边距宽度以使不一样绘图的轴排成一行。在本例中,我必须将左边距设置为 6 个字符宽度,以便调整 cosec(x) = 1/sin(x) 的科学记数法中的 tics。


清单 7. Multiplot 示例
set xrange [-pi:pi]
# Uncomment the following to line up the axes
# set lmargin 6
# Gnuplot recommends setting the size and origin before going to
# multiplot mode
# This sets up bounding boxes and may be required on some terminals
set size 1,1
set origin 0,0
# Done interactively, this takes gnuplot into multiplot mode
# and brings up a new prompt ("multiplot >" instead of "gnuplot >")
set multiplot
# plot the first graph so that it takes a quarter of the screen
set size 0.5,0.5
set origin 0,0.5
plot sin(x)
# plot the second graph so that it takes a quarter of the screen
set size 0.5,0.5
set origin 0,0
plot 1/sin(x)
# plot the third graph so that it takes a quarter of the screen
set size 0.5,0.5
set origin 0.5,0.5
plot cos(x)
# plot the fourth graph so that it takes a quarter of the screen
set size 0.5,0.5
set origin 0.5,0
plot 1/cos(x)
# On some terminals, nothing gets plotted until this command is issued
unset multiplot
# remove all customization
reset


图 7. Multiplot 绘图
图 7. Multiplot 绘图

回页首

绘制数据图

虽然本教程只是出于说明目的,大部份内容都集中于绘制正弦曲线,您极可能很想对试验数据、销售数据或其余相似数据绘图。在这一节,咱们将使用 IBM 的股票价格做为数据集合说明如何绘制不一样的图(本例的原始数据包含在 参考资料部分中):

表 1. IBM 股票价格

日期 开盘 最高 最低 收盘
10-Jun-04 90.23 90.75 89.89 90.46
9-Jun-04 89.90 90.55 89.81 90.09
8-Jun-04 88.64 90.50 88.40 90.04
7-Jun-04 88.75 88.99 88.01 88.64
4-Jun-04 87.95 88.49 87.50 87.56
3-Jun-04 87.85 88.10 87.35 87.35
2-Jun-04 88.64 88.64 87.89 87.98
1-Jun 04 88.00 88.48 87.30 88.12

大多数数据集合都是数字列,可是这个数据集合有所不一样,由于 x 轴是时间数据。下列代码告诉 gnuplot 如何读取和格式化 x 轴上的时间数据(有关详细信息,请参阅 help time/datahelp set timefmt ):


清单 8. 设置时序数据
set xdata time  	# The x axis data is time
set timefmt "%d-%b-%y"	# The dates in the file look like 10-Jun-04
set format x "%b %d"	# On the x-axis, we want tics like Jun 10

一旦设置完成,可使用下列命令对开盘价绘图。咱们选择在不一样的开盘价之间使用直线插值法,并使用 linespoints样式,而不仅是 points

plot ["31-May-04":"11-Jun-04"] 'ibm.dat' using 1:2 with linespoints


图 8. 绘制开盘价图
图 8. 绘制开盘价图

象往常同样,["31-May-04":"11-Jun-04"] 显式设置了 xrange,但不是彻底必要的。注意范围的 minmax 须要指定为符合 timefmt 的字符串。

取决于使用的绘图样式,gnuplot 在绘制一个点时最多可使用六个不一样的编号。当读入记录时,列从 1 开始编号。 using 1:2 告诉 plot 命令使用第一列做为 x 轴,第二列做为 y 轴。因此要绘制收盘价图,咱们将使用 using 1:5

每次 gnuplot 看到新的数据分隔符时,列编号就会增长。默认状况下,数据分隔符为空格。因此若是时间格式中间有空格(例如 10 Jun 04 ,而不是 10-Jun-04 ),咱们将须要使用 using 1:4 代替 1:2 。对于 x 轴,咱们仅须要指定数据开始的第一列。Gnuplot 可以智能地使用 timefmt 字符串读取其余列。

using 使您能够添加两个以上的冒号,用于指定特定绘图样式可能须要的任何其余列。您还可使用 $n 表示第 n 列,从而对二进制表达式进行绘图。在一个彻底虚构的示例中,咱们假设不一样的价格表示不一样的试验运行,咱们要绘制平均价、最高价和最低价。 yerrorbars 样式使您能够绘制 y-high/y-low 值(咱们在 using修饰符中指定为 x:y:ylow:yhigh)以及计算 y 轴四个价格的平均值为 ($2+$3+$4+$5)/4:

plot ["31-May-04":"11-Jun-04"] 'ibm.dat' using 1:($2+$3+$4+$5)/4:4:3 \
title 'daily prices, IBM' with yerrorbars


图 9. 计算平均值
图 9. 计算平均值

errorlines 样式是类似的,但它还在绘制的 y 轴点之间绘制线段。对于绘制财务条形图,Gnuplot 还有单独的样式,分别是最高价、最低价和 tics 在左边,右边为开盘价和收盘价。咱们使用 set bars 显示开盘价和收盘价的较大 tics):

set bars 5
plot ["31-May-04":"11-Jun-04"] 'ibm.dat' using 1:2:3:4:5 with financebars


图 10. 绘制财务条形图
图 10. 绘制财务条形图

您还能够查看 help plotting styles 得到其余相关样式,如 candlesticks、boxerrorbars 和错误绘图样式。

处理真实数据集合

固然,对于真实的数据集合,事情可能会变得更复杂。最多见的就是数据集合不使用空格字符分隔数据点。gnuplot 4.0 提供了新的功能,您可使用 set datafile separator <string> 指定本身的分隔符。一样地,您还可使用 set datafile commentschar 指定除了 # 以外的注释字符。若是须要更多的控制,您能够为 using 修饰符明确指定格式字符串。Gnuplot 使用 C 标准库的 scanf 函数以及给定格式字符串(有关详细信息,请参阅 help using )读入数据。我讲述此方法仅是为了内容更全面;可以以此方法读入的数据集合也可使用 set data file separator 进行处理,或者经过显式指定 using 修饰符中要使用的列编号来进行处理。例如,若是须要忽略第一列中的字符串,则使用 2:3 进行绘图。为了得到更彻底的灵活性,在具备 popen 函数的 Unix 类系统中,在将文件传送给 plot 命令以前,可使用文本处理实用程序对文件进行预处理。例如: plot "< awk --f preprocess.awk data.file" 。不幸的是,该命令不能在全部系统中使用。最后的一个方法是在 gnuplot 中使用输入文件以前对其进行预处理。

有时,真实的数据可能没有包含全部的点 —— 对于要绘图的列,可能有 x 值,但缺乏相应的 y 值。Gnuplot 容许您指定字符串,用于表示缺乏的数据点。例如:

set datafile missing 'NaN' # The IEEE floating point not-a-number

注意,在 4.0 版本以前,命令是 set missing <string>

不幸的是,处理缺乏数据的数据点的方法取决于 using 说明。若是想了解用法 plot 'file'plot 'file' using 1:2plot 'file' using ($1):($2)之间区别的详细信息,请参阅 help using。可是为了安全起见,一般指定列使用显式的 using 格式,若是您想彻底清除不合适的数据点,不要使用表达式求值(第三个选项会由于括号而对表达式求值)—— 而是,预处理数据文件并用计算的表达式的结果添加确切的列。

往常,您可能以一些无效的数据点而结束。若是 gnuplot 被告知忽略无效数据点,您仍能够对这样的数据集合绘图。Gnuplot 忽略未定义的点,这样当您遇到不合适的点时,技巧就是使用未定义的 y 值,如1/0。相似于 C 的三元算符能够很容易地表达此信息(若是您不熟悉此函数,请参阅 help ternary ;在定义分段函数时它也很是有用)。下面是 help using 中介绍的一个例子,它使您以第二列做为 y 值来绘图,除非第三列大于 10:

plot 'file' using 1:($3>10 ? $2 : 1/0)

回页首

高级例子

虽然本文向您展现了会常用的大多数命令,但可能有些地方您还须要进一步地研究。在这一节,咱们简要讨论其中一些概念,而后提供了其中一个 gnuplot 演示文件(electron.dem)中的脚本,该脚本绘制电子学中常见的幅频响应图,用以说明它们的用法。

  1. 用户定义的函数和变量
    您能够任意定义本身的复杂函数,以下面的 A(jw)。这些函数能够用参数 (p1, p2) 表示,您能够稍后在 plot 命令中使用它们以前再定义参数变量。
  2. 复数
    Gnuplot 能够识别复数。{a,b} 表示复数 a+bi。您可使用函数 abs() 和 arg() 得到绝对值和辐角。
  3. 虚变量
    当在 plot 命令中使用 sin(x) 时,gnuplot 将 x 用做虚变量,并对它赋不一样的值以得到示例。当编写复杂的用户定义的函数时,您可使用函数定义中使用的传统变量名称,也能够显式设置要使用的虚变量的名称(例如, set dummy jw )。
  4. x2 和 y2 轴
    除了常见的沿着曲线图底部和左边的 x 轴和 y 轴以外,还可使用曲线图的顶部(x2)和右端(y2)做为单独的轴。这些轴都相互独立,能够单独设置范围、tics、标签和比例(例如对数刻度)。并且,经过使用 axes 子句, plot 命令可使用不一样的轴集合,如 x2y2。默认状况下, plot 命令以 x 轴和 y 轴绘图。当您须要同时绘制范围为不一样量级或具备不一样单位的线时,此高级功能很是有帮助。在下面的示例中,y 轴绘制振幅,最大值为 1,y2 轴绘制相位,最大值为 100。若是对轴的相同集合绘图,振幅曲线几乎看不出来。
  5. 对数刻度
    您可使用 set logscale 命令以对数刻度绘制任何轴。此命令在轴上绘制以 10 为底的值的对数。您能够显式设置使用的底数(例如, set logscale 2 ,或若是仅为 x 主轴和 y 主轴设置底数,则可使用 set logscale xy 2)。

下例摘自与 gnuplot 一块儿提供的演示文件 electron.dem。此脚本使用了上面讨论的全部高级概念:


清单 9. 幅频响应
A(jw) = ({0,1}*jw/({0,1}*jw+p1)) * (1/(1+{0,1}*jw/p2))
p1 = 10
p2 = 10000
set dummy jw
set grid x y2
set key default
set logscale xy
set log x2
unset log y2
set title "Amplitude and Phase Frequency Response"
set xlabel "jw (radians)"
set xrange [1.1 : 90000.0]
set x2range [1.1 : 90000.0]
set ylabel "magnitude of A(jw)"
set y2label "Phase of A(jw) (degrees)"
set ytics nomirror
set y2tics
set tics out
set autoscale  y
set autoscale y2
plot abs(A(jw)), 180/pi*arg(A(jw)) axes x2y2


图 11. 振幅和相位频率响应
图 11. 振幅和相位频率响应

回页首

结束语

在本文中,咱们讨论了使用新发布的 gnuplot 4.0 绘制 2D 图形的复杂性。虽然咱们接触了大多数的关于使用 gunplot 的重要方面,但限于篇幅有限,咱们仍有少数主题没有讨论。值得注意的一些省略范围包括从很是简单的参数函数绘图(请参见 help parametric )、极坐标( help polar ),到曲线拟合(它使用户定义曲线与给定数据集合相匹配)。曲线拟合是一门艺术,须要用一整篇文章来说述,可是请参阅 help fitbeginners_guide and tips 来对它得到初步了解。

经常使用技巧

正如咱们所看到的,gnuplot 是高度可定制的。我将以这个最后的技巧来结束本文,它说明如何在多个 gnuplot 会话中重用您的定制。定制的主要命令是 set 命令。您可使用 save set 'filename' 保存当前会话的全部设置。 save var <file>save func <file> 分别保存用户定义的变量和函数。可是没法保存传送到单一 plot 命令的定制(例如, plot [-pi:pi] sin(x) 中的 x 范围)。这些文件可使用 load <file> 读回。Gnuplot 还在开始时查找名为 .gnuplot 的文件。它首先在当前目录中查找,而后在用户的主目录中查找(Windows 中的 USERPROFILE 目录)。若是找到初始化文件,gnuplot 会执行其中的命令。一些用户将此方法用于设置终端类型和定义常用的函数或变量。

相关文章
相关标签/搜索