用gnuplot绘制你的数据
时间:2009-07-21 来源:guo333806
翻译老外的文章,原作者ishanth Sastrygnuplot
gnuplot是一个自由分发的绘图工具,已经被移植到几乎所有的主要系统上。它有两种工作模式:当你需要调整 和美化一幅图使之正确,你可以用交互模式操作它,也就是在gnuplot提示符后输入命令。另外,gnuplot可以从文件中读取命令,以批处理的方式产 生图片。例如,如果你要做一系列的实验,并且需要在每次实验后观察实验结果的图片;或者,当你修改一张你很久以前做的图片的某一部分时,批处理模式就特别 有用。因为,你在所见即所得编辑器里美化图片时捕捉鼠标点击很困难,但你可以很容易地把gnuplot命令存入一个文件,并在6个月后在交互方式下重新执 行。
gnuplot最早由Colin Kelley 和Thomas Williams开发于1986年。一些贡献者为其添加了不同的“终端”支持产生不同的变种。在1989到1990年间,这些被融入 gnuplot2.0。2004年4月,4.0版发布。这个教程是用于4.0版的,但这里介绍的大部分命令也可以用于其它版本。可能的情况下,我会提到那 些主要的区别。gnuplot的官网列在资源里。
下面,我们给新手一个方便的教程;但即使你有gnuplot使用经验,你也可能会发现出现的4.0版的新术语和新命令。我 们从一个简单的sin函数曲线开始并且按照我们的需要进行定制。接着我们将学习如何画一系列的数据点。本文,我们只讨论2D绘图,因为这是最一般的情况。
|
GNG:gnuplot不是GNU
虽然名字有所暗示,gnuplot不使用GPL。对于法律上的好奇,gnuplot的FAQ #1.7说:“gnuplot是在你免费使用意义上的自由软件。但你不能自由发行你自己修改的版本。请阅读并接受你那版的版权文件。
|
经常,新手用户可能对他们图片可能的外观有很好的想法,但明显不是他们需要使用的gnuplot命令。 所以理解gnuplot的关键是很好掌握它的单词表,并且能本能地使用它们。这个教程里,我只能提供给你最终使用gnuplot的一般选项的感觉;这绝对 不是彻底的。所以,例如,我告诉你如何设置x-range来限制图片x轴的范围,设置y-range也是类似(使用yrange来代替命令中的 xrange),但我不会再说。
如果你想要做些有价值的事情,你就不可避免要使用gnuplot所带的在线帮助。语法是统一的:任何命令的帮助 信息都可以通过键入help <command>来得到。来吧,运行gnuplot,并且马上试一下命令help set yrange和help set。一般,gnuplot帮助会提供命令所有可能定制的进一步的帮助信息。看一下帮助中的例子部分会对更好理解如何使用一个命令有所帮助。
gnuplot还带有一大堆演示来显示它的功能,一般放在安装目录的demo文件夹中。要得到这些绝技,在gnuplot提示符下转入这个目录(例如,cd ‘/opt/gnuplot/demo’ – 注意gnuplot要求所有文件和目录名用单引号或双引号括起来),并且输入load ‘all.dem’。这个目录每个.dem文件演示一个功能,而all.dem一次性加载所有文件。你可能想看完本文后再做这个练习,这样我们的教程不会在更忙乱中开始。
如果想跟着做的话,你可以在提示符下将那些代码一行行输入。另外,可以把代码存入一个临时文件中,并在提示符下输入load ‘filename’来运行它(别忘记引号)。 如你所想,2D绘图命令是plot。输入plot sin(x):你就可以看到一个弹出窗口中熟悉的sine曲线。我们刚才使用了replot命令,它执行前一个绘图命令。这个命令很有用,当你刚调整了一个图片并且需要继续调整,加入需要的特性时,就用它。另外,replot让你加入更多的图。试一下输入replot cos(x)。句法上,这相当于plot sin(x), cos(x)。replot只是简单地把之前的绘图语句,加上一个逗号,再加上余下的输入部分。
最后一个使用的命令是reset,严格说来,对画sine曲线是不必要的。它清除之前所有set命令的效果,恢复成缺省值。这样,在这个例子里,它使用缺省的x-range。 现在,我们试一下更有趣的东西:plot sin(x)/x。你会看见下面的图: 500)this.width=500;" border="0" width="500"> 就从这三个例子里,可以看出,gnuplot理解pi并且有丰富自然的数学功能词汇表。它甚至知道有用的统计函 数正态分布和深奥的特殊函数如lambert, bessel, beta 和 gamma函数(还有更多!)。这些一般只有一些成熟的数学工具如mathematica里才有。经验上,它的语法与C语言的语法类似,也就是说与日常数 学的语法类似。(一个重要的例外是幂表达式:x的y次方,习惯地写成x**y)。接下来,我们给图加个标题(”My First Graph”),坐标轴也一样(x轴是”angle, in degrees”,y轴是”sin(angle)”)。
注意,xlabel设置串里的\n产生一个换行。一般,gnuplot对双引号字串里的反斜线进行类似C语言的 处理。windows的用户需要知道:如果你打算用双引号括住文件名,必须使用双反斜线:例如”c:\\developerworks”(或者,你可以使 用正斜线:”c:/developerworks”)。 现在,我们注意到x轴不是用度来标记的并且看上去不怎么样。我们把这些改掉,调整x轴上的标记,只在90度增幅 点上标记数字,在45度增幅点上做标记。主要标记是0级别,这是缺省的;次要标记的级别是1。每个标记点分别由一个3-元组定义:”label”(用引号 括起来),<要标记的点>,和<可选级>。
另外,请注意我们用反斜线来把xtics命令扩展到多行输入。这可以让长而复杂的命令容易阅读。 我们还用set grid开启了网格,这方便你观察图形数据。前面我们一直在使用set命令。gnuplot有统一的方法取消设置:在gnuplot4.0里,这个命令是 unset。例如,如果你不喜欢网格,就用unset grid。4.0版以前这个命令一直是set nogrid。
顺便说一下,我们给的所有例子都可以在交互模式或批处理模式下运行。交互模式下,在提示符后输入每行命令就可以 运行了。批处理模式下,要把命令输入到文本文件中,并且,或者是在gnuplot提示符后使用load ‘filename’读入它,或者是在shell提示符后当作参数传给gnuplot:$gnuplot filename。用第二种方法,gnuplot在执行完输入文件中的所有命令后就会退出,所以在把图形直接绘入文件的情况下,这种批处理方法效率最高 (见下一节)。如果第二种方法用在向屏幕绘图中,输出窗口会在绘图一结束就消失(当gnuplot退出时),所以,你需要使用明确的pause –l命令(见help pause)留住窗口。
批处理方式下,gnuplot命令文件会保留一段时间,所以使用注释对增加可读性很有帮助。任何从#到行末间的东西都是注释。所以在代码3里,gnuplot不会处理“我们只要一个周期”。
现在,output.png里是你刚画的图,可以放入一个更大的报告里了。还有些为一些流行的类型设置和绘图程序准 备的特殊终端,包括Adobe Illustrator(set term aifm),Corel Draw(set term corel), AutoCad(set term dxf), 和 几种 LaTex相关的终端(eepic, latex, pstricks, texdraw, tpic,等等)。你也可以在PostScript里得到这个文件,用加强的PostScript(eps)或Adobe 的PDF格式。你的gnuplot版本可能没有把所有的终端驱动一起编译进去----例如,windows用户不需要X11终端,而Linux用户不需要 windows终端。类似的,由于法律原因,gnuplot4.0删去了对gif的支持。
所有终端的能力是不同的。一些象LaTeX的不支持文字旋转,所以,如果你设置了ylabel,象我们之前所做 的那样,在不同的终端上看到的结果是不同的。别一方面,你可以在确定LaTeX终端的情况下使用LaTeX命令。例如,set ylabel “$sin(\\theta)$” (注意,我们用了双反斜线来产生LaTeX所需要的单反斜线 ---- gnuplot在做了双引号内反斜线处理后才把字串传送给终端驱动)。现在,你可以把你的输出文件使用\input{output.tex}放入你的 LaTeX文件。同样,在PostScript终端里,使用对应的PostScript命令:{/Symbol q}。对加强的PostScript和LaTeX来说,你都可以用标记x^{superscript}和x_{subscript}做上标。还要注意缩写 的终端和输出命令:# 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命令,它用来在同一个输出屏幕或文件中产生多个图形。
聪明的读者可能已经从前面对replot的注释中猜到,gnuplot可以为你同时画多个曲线。现在我们同时画正弦 余弦曲线。简单的绘图命令是plot sin(x), cos(x);要画的图形用逗号分开。如果你没有设定其它东西,gnuplot自动使用两种颜色画出两个图形把他们互相区分开----在象windows 和X11的终端里。单色终端用不同的线型显示图形。你可以从图例asd中看出图形中的哪条曲线是哪条。gnuplot也可以让你选择使用什么样式来画图。
unset xtics # keep all other things simple plot sin(x) with linespoints pointtype 5, cos(x) w boxes lt 4你可以用with短语(参见help plot with,如果使用版本4.0,也看看help plotting styles)定义眼花缭乱的细节,确定你希望的曲线的外观。在这个例子里,我们显示两个有用的风格。第一个风格,linespoints,一般在画数据 图时使用。它在每个样本或数据点上标记一个点,并用线性插补的方法连接相邻的点。现在,我们添加定义点的类型为5,即选择终端功能里的第五种点。第二个风 格,boxes,更适合画柱状数据图。注意我们是如何在cos(x)曲线里缩写with as w。类似的,它是线型的缩写,并且是另外一种终端定义设置,选择终端能绘制的第四种线型。无需多说(什么?你还没试试help plot with?),你可以用pt代替冗长的点类型。如果你打算用同样的绘图风格绘制几条曲线(或者在一条绘图命令里,或者在几条命令里),你可以用一条set 命令设置绘图风格。在gnuplot4.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 [-pi:pi] sin(x)设置xrange。使用这类语法可以快餐式单次性改变缺省绘图选项。要多图绘制或多绘图命令中重复使用,就应该用set命令。 当画两条或更多曲线时,我们需要图例asd来区分它们。缺省情况下,图例在右上角,但如果它干扰了你的图形,你 可以把它放在别的地方----如果你愿意,甚至可以在图外。下面的代码片断把图例放在左上角,并用一个框围住。我们还修改了图例中的曲线名,在绘图命令中 定义了名字。命令中的title可以缩写为t,象我们在画余弦曲线中所做的一样。如果你不想在图例中命名曲线,使用notitle代替title。最后一 点,经常折磨新手的一个问题,就是如果有名字的话,一定要放在with短语的前面:
现在用一个简单注释的multiplot例子来说明,分别画出正弦,余弦和它们的倒数曲线。基本方法是将屏幕或图形 文件边框比例设置为1。接着,我们画这些不同的曲线让它们分别占据四分之一的屏幕。我们也用设置屏幕原点坐标的办法控制曲线显示的位置(参看help coordinates中有关不同坐标系统的讨论)。也要注意,每次绘制都是自动计算轴的宽度,标注等等----所以,你可能需要修改空白宽度来对齐不同 的图。在这个例子里,我必须设置左边距为6字符宽,以容纳cosec(x) = 1/sin(x)用科学计数法的标注。
设置好后,我们可以用下面的命令画开盘价。我们选择在不同的开盘价间使用直线插值,并使用linespoints风格而不仅是points风格:
plot ["31-May-04":"11-Jun-04"] 'ibm.dat' using 1:2 with linespoints
依赖于所用的绘图风格,gnuplot在画一个点时,可以用到最多6个不同的数字。当一个记录被读入,那列数据被标记为从1开始。using 1:2告诉绘图命令使用第一列作为x轴和第二列作为y轴。所以,要画收盘价,我们就得使用using 1:5。
gnuplot每读到一个新数据分隔符就增加列数据字。缺省分隔符是空白符。所以,如果我们的时间格式中间有一 段空白(例如,10 Jun 04而不是10-Jun-04),我们需要使用1:4而不是1:2。对x轴,我们只需要定义第一列,数据从那里开始。gnuplot有足够的智能使用时间 串去读其它列。
你可以用using添加多于2个冒号来定义额外的数据列,这可能是一些绘图风格所必须的。你也能用使用了$n表 示第n列数据的声明表达式绘图。在这个完全虚构的例子里,我们假设不同的价格代表一次不同的实验,并且我们想绘制平均数,最高值和最低值。你可以用 yerrorbars风格绘制y-high/y-low值,这里我们在using修饰语句里定义为x:y:ylow:yhigh,并用($2+$3+$4 +$5)/4来计算的4个价格的平均数作为y轴: plot ["31-May-04":"11-Jun-04"] 'ibm.dat' using 1:($2+$3+$4+$5)/4:4:3 \ title 'daily prices, IBM' with yerrorbars
当然,真实生活中的数据集里问题更复杂。用非空白符分隔数据点的数据集很常见。作为gnuplot4.0的新功能, 你可以用set datafile separator <string>来设置你自己的分隔符。类似的,你也可以定义一个注释符来代替#,用命令set datafile commentschar。如果你需要更多控制,你可以为using修饰短语明确定义一个格式串。gnuplot根据所给的格式串(参看help using了解所有细节),用C语言标准库函数scanf的方式读数据。我仅仅是为了完整性而提起这个方法的,大部分可以用这种方法读入的数据集,也可以 使用set data file separator或明确定义using短语中的列数字来处理。例如,如果你在第一列有一个需要忽略,用plot using 2:3就行了。为了完整的柔性,在带有popen函数的类UNIX系统里,你可以使用文本处理工具预处理文件后再传给绘图命令。例如: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:2, 和 plot 'file' using ($1):($2))之间区别的详细细节,请参看help using。但安全起见,定义数据列时请坚持使用明确的using格式,并且,如果你想完全删除坏数据点,不要使用表达式评价(因为括号,第三个选项评价 表达式)---- 而预处理数据文件和增加明确的表达式计算结果数据列更好些。
还有时,你数据集的结束数据可能无效。如果能通知gnuplot无效的数据点,你仍然可以画出此数据集。 gnuplot只是安静地忽略未定义点,所以有个小技巧,当你遇到不合适的点就使用一个未定义的象1/0之类的y值。象C语言中的三重操作符来表达这种情 况非常方便(如果你对这个函数不熟悉,请参看help ternary;它在分段函数定义中也很有用)。这里有一个在help using中提到的例子,让你把第二列数据当作y值画出,除非第三列大于10:plot 'file' using 1:($3>10 ? $2 : 1/0)
你可以定义自己的任意复杂的函数,类似下面提到的A(jw)。它可以带参数(p1, p2),而且,你可以稍后再定义这些参数,只要在绘图命令使用它们之前就行。
就如我们所见,gnuplot是高度可定制的。我总结的最后窍门是如何把你的定制用于多个gnuplot会话:定制 最主要的命令是set命令。你可以用save set ‘filename’来保存你当前会话里的所有设置;用save var <file>和save func <file>分别保存用户定义的变量和函数。但是在单个绘图命令里使用的定制(例如plot [-pi:pi] sin(x)里的xrange)是无法保存的。这些文件可以用load <file>读回来。gnuplot在启动时也会查询一个叫. gnuplot的文件。它先在当前目录,接着在用户主目录(在Windows里是USERPROFILE目录)查找。如果找到初始化文件,gnuplot 就执行里面的命令。一些用户就用这个设置终端类型和定义常用的函数和变量。
· Do please note that gnuplot is not GPL'd, nor in any way related to GNU or the Free Software Foundation. An older GNU bulletin explains: "Curiously, [gnuplot] was neither written nor named for the GNU Project; the name is a coincidence. Various GNU programs use gnuplot."
· Indeed: gnuplot works exceptionally well in combination with the GNU plotutils; see also the plotutils documentation.
· The official Gnuplot FAQ is very useful, as is the unofficial not so Frequently Asked Questions site (the latter has specific information about using gnuplot in scientific papers).
· A Google search on "gnuplot introduction" or "gnuplot tutorial" yields several short gnuplot 3.7.x tutorials that can be useful, even though they reference the previous, and not the most recent, release version.
· Download the IBM stock price data (ibm.dat) used for the data plots, and the example TeX file (input.tex), which shows how you can include gnuplot plots in a LaTeX report.
· The article " Data visualization using Perl/Tk" (developerWorks, 2003) discusses plotting with Perl.
· For an overview of using ImageMagick from the command line, read "Graphics from the command line" (developerWorks, July 2003).
· "Introduction to Scalable Vector Graphics" (developerWorks, 2004) shows how to to easily generate graphics (such as graphs and charts) from database information, and how to to add animation and interactivity to graphics.
· Find more resources for Linux developers in the developerWorks Linux zone.
· Browse for books on these and other technical topics.
· Develop and test your Linux applications using the latest IBM tools and middleware with a developerWorks Subscription: you get IBM software from WebSphere, DB2, Lotus, Rational, and Tivoli, and a license to use the software for 12 months, all for less money than you might think.
· Download no-charge trial versions of selected developerWorks Subscription products that run on Linux, including WebSphere Studio Site Developer, WebSphere SDK for Web services, WebSphere Application Server, DB2 Universal Database Personal Developers Edition, Tivoli Access Manager, and Lotus Domino Server, from the Speed-start your Linux app section of developerWorks. For an even speedier start, help yourself to a product-by-product collection of how-to articles and tech support.
原文地址 http://www.ibm.com/developerworks/library/l-gnuplot/