使用gnuplot科学作图Gnuplot中文教程版本1.0马欢yFebruary9,2012目录前言41安装52启动53数学表达式64简单函数绘图65坐标取值范围及刻度96简单数据绘图117点线风格148多组数据绘图169输出eps图片1810输出pdf和png图片2111Enhanced文本模式2312插入LATEX公式2613栅格以及方程数值解估算2714第二坐标轴29使用gnuplot科学作图–Gnuplot中文教程byHuanMaislicensedunderaCreativeCommonsAttribution-NonCommercial-ShareAlike3.0UnportedLicense.yCopyrightc⃝2011HuanMa.欢迎反馈:yusufma77@yahoo.com115Gnuplot的坐标系统及标签3116箭头3317边框和坐标轴3418图例3619对数坐标3820图像尺寸4021极坐标4122参数方程4323误差条4424拟合4625简单3D函数绘图4726数据文件存储格式50273D数据曲面绘图及边框5128Pm3d绘图5329色板(palette)设置5630Image绘图5731等高线图5932等高线的颜色6133Table输出6334多图(multiplot)6435曲线色彩填充6636填充风格6837柱状图7038阶梯图7339数据平滑7440统计直方图76241三元算符和分段函数7842几何图形对象8043地图及圆圈数据图8144for循环8345动画和reread循环84A附录:互联网资源86索引873前言对于科技工作者来说,gnuplot是一个非常好用的绘图软件。因为感慨于gnuplot中文资料和文档的缺乏,我于数月之前在科学网博客开始撰写“谈谈gnuplot”系列博文,至今已写了四十五篇。虽然还有不少细节问题没有涉及,但是我觉得这些博文已经可以构成一个比较完整的gnuplot中文教程。对大多数用户来说,这一系列博文已经涵盖了日常应用的需要。为了方便大家阅读,我现在将这一系列博文集结编辑成为此教程,以CCBY-NC-SA知识共享协议发布。如果有朋友对这一系列文章有什么建议,欢迎提出来,我们可以不断完善和补充。希望我的这些文章对推广开源软件和减少盗版软件的使用能有所帮助。41安装gnuplot是一个小巧实用的数据处理工具,主要用来绘制2D/3D的数据或者函数图像,但是也包含数学计算、拟合等功能。虽然它的名字里有个“gnu”,但是它和大名鼎鼎的GNU没什么关系,使用的授权协议也不是GNUGPL,所以这里的“gnu”是小写,全名应该读作“newplot”。所有的主流Linux发行版都包含gnuplot,因此在Linux上安装很简单,只要用各相应发行版的软件安装工具直接安装就可以了。在苹果电脑上的安装也不复杂。MacPorts项目把很多Linux上的应用程序移植到了苹果系统上,其中就包括gnuplot。只需要在苹果电脑上安装MacPorts,之后就能通过port命令安装包括gnuplot在内的各种Linux应用程序了。在Windows下,可以直接到gnuplot在sourceforge的下载网页下载最新版本(文件名包含win32的那个),解压之后到binary目录里找到gnuplot.exe直接执行就可以了。2启动gnuplot是基于命令行的交互式绘图软件。打开一个终端,输入gnuplot,随着程序启动,会出现下面的信息:(如果是在Windows电脑上,双击gnuplot.exe后会自动打开一个命令行窗口)这里包含gnuplot的版本、系统、版权等信息。最关键的是最后一条:Terminaltypesetto’wxt’什么是terminal?在gnuplot中,terminal就是说你打算用什么方式输出图片。这里默认的terminal是wxt,也就是直接输出到电脑屏幕上。gnuplot支持七十多种terminal,没必要都记住。我们以后会挑主要的几种讲一下。提示信息之后,是gnuplot的提示符:gnuplot在提示符之后输入各种命令,就可以开始画图了。如果要退出程序,只需要输入quit或者exit命令。53数学表达式在我们开始画图之前,需要知道gnuplot里面是如何表达数学公式的。加、减、乘、除、乘方分别用+,-,*,/,**表示整数和浮点数和C语言类似,gnuplot对整数和浮点数(实数)区别对待,整数的运算结果还是整数。所以在处理整数除法时要尤其小心,例如7/2的结果是3而不是3.5复数gnuplot支持复数运算,复数用包含在花括号内的一对实数表示,例如{3,5}表示3+5i数学函数gnuplot含有丰富的数学函数,格式和C语言几乎相同。对于实数和复数,函数名是一样的。下面的链接可以看到预定义的函数列表:自定义函数自定义函数很容易,例如f(x)=x+1定义一个一元函数,f(x,y)=x+y定义一个二元函数。(圆周率)在gnuplot里用pi表示。这里是一些例子:这里用到了print命令,就是把结果输出到屏幕上。有了这些知识做准备,我们就可以正式开始画图了。4简单函数绘图终于可以开始画图了!先从简单的函数图像入手吧。gnuplot里面的2D作图命令是plot。先试着画一个正弦函数:gnuplotplotsin(5x)6这个正弦函数看着有点别扭,是吧?这是因为gnuplot默认的函数取样为100个点,对于快速振荡的函数,这个取样率有点低。函数取样数目由samples这个参数控制。在gnuplot里面,所有参数赋值都由set命令完成。我们把函数取样数目改为500:gnuplotsetsamples500gnuplotreplot怎么样,现在看起来好多了吧?这里用到了replot命令。顾名思义,replot就是把刚才的plot命令重新执行一遍。图像右上角的图例(就是那个sin(5*x)后面带一段横线)看起来有点碍眼。在gnuplot里面,这个图例叫做key。对于同时包含多组数据的图像来说,图例是必要的。但是现在图像只包含一个函数,而且这个图例的位置也不那么对劲儿,我们先把它去掉:7gnuplotunsetkeygnuplotreplot这里我们看到,可以用unset命令取消一个参数设置。现在碍眼的图例没有了,但是随之而来的问题是,我们不知道这个图像究竟表示什么意思。为了让它成为一个完整的科学作图,我们给它加上标题和坐标轴标签:gnuplotsettitlesin(5x)␣函数图像gnuplotsetxlabelXgnuplotsetylabelYgnuplotreplot8xlabel和ylabel分别表示横轴和纵轴的标签。在gnuplot里,很多跟坐标有关的参数,都有相应的x和y版本。title虽然可以给图像加上标题,但是在真正的科学论文里意义不大,因为所有论文插图都要求配有文字说明(Caption)。引号内的内容为字符串,大多数情况下双引号和单引号没有区别,除非遇到特殊字符(例如换行符nn),这时候单引号会把特殊字符当成一般字符处理,而双引号会按照特殊字符的意义将其展开。这里我们注意到,字符串里也可以包含中文。究竟是否支持中文,和terminal的种类有关系。有些terminal对Unicode支持不那么好,这时候显示中文就不那么容易了。好在我们可以选择那些比较有利的terminal。现在我们有了一个简单的函数图像了。虽然看起来还不尽人意,但是没关系,我们以后会把它逐渐完善。5坐标取值范围及刻度我们从上一讲结束时的图像开始。这里默认的x取值范围是从-10到10。我们现在希望x的取值范围从-2到2,这样函数图像可以正好包括十个周期。横坐标取值范围由xrange参数控制。还记得gnuplot里面所有参数都由set命令控制吗?取值范围由方括号内的一对数表示,两个数之间用冒号隔开:gnuplotsetxrange[ 2pi:2pi]gnuplotreplot(不要忘记,每一个和x坐标有关的参数,都对应有一个和y有关的参数,所以纵坐标的取值范围由yrange控制。)现在横坐标取值范围已经符合我们的要求了,但是横轴上的刻度并不是我们想要的。我们不想要刻度出现在整数位置上,而是希望刻度为的整倍数。另外,我们还希望两个主刻度之间=2的位置有一个分刻度,分刻度只要有刻度就可以,没必要标出数字了。gnuplot里面,横轴主刻度和分刻度,分别用xtics和mxtics表示(m表示minor)。我们试试下面的命令:gnuplotsetxticspignuplotsetmxtics29gnuplotreplot这里的命令表示:横轴主刻度间隔为,每两个主刻度之间被分刻度分为2份。这组命令得到的图像如下:现在刻度间隔对了,但是显示的数字并不是我们想要的。我们希望显示字符,而不是小数3.14159。其实,setxtics命令的形式并不是唯一的。我们试试下面的形式:gnuplotsetxtics( 2 2pi, 1.5pi1, pi,\ 0.5pi1,00,0.5pi1,pi,1.5pi1,\22pi)gnuplotreplot这里setxtics命令直接规定了每个刻度的位置和显示的字符。每一个刻度对应三个参数:显示字符、刻度位置、刻度等级。刻度等级为0时表示主刻度,等级为1时表示分刻度。对于主刻度(等级为0时),表示等级的参数也可以省略不写。各个刻度的参数之间用逗号隔开。从上面的例子我们还看出,显示字符可以为空,也就是只标刻度,不显示字符。另外,如果命令太长,需要把一条命令分为多行来写,可以在换行时末尾加上反斜杠(n),表示这条命令还没有结束。这组命令得到的图像如下:10现在横轴坐标已经完全符合我们要求了,我们把纵轴坐标也调整一下,因为我们不需要这么细的划分纵轴刻度:gnuplotsetytics 1,0.5,1gnuplotreplot这里又用了setytics命令的另一种形式(再次提醒一下,xtics和ytics语法是完全一样的):后面跟了逗号隔开的三个参数。这三个参数分别表示:最小主刻度、主刻度步长、最大主刻度。图像如下:现在我们完成了对于坐标轴的一些微调,图像看起来更顺眼了。6简单数据绘图之前讲过了简单的函数绘图,而实际科研中更多用到的是数据绘图。11在讲如何用gnuplot进行数据绘图之前,我们先介绍一个gnuplot里最有用的命令:help。gnuplot内含一个非常有用的帮助系统。随着我们学习的命令越来越多,记住所有命令的用法不太现实,所以我们会更多的依赖这个帮助系统。例如,我们想知道setxtics命令的用法,只要在gnuplot里输入:gnuplothelpsetxtics就能得到完整的setxtics用法及实例。好了,下面我们讲数据绘图。首先介绍我们的数据文件。这是一个关于北京市一年中每月平均降水量的数据,我们的数据以纯文本方式储存在文件名为datafile.dat的文件中,文件全文如下:###文件开始####北京月平均降水量(mm)##月份降水量#==============12.525.1310.2425.4527.9671.17175.38182.9948.31017.8115.1122.5###文件结束###数据分为两列,第一列为月份,第二列为降水量。以#符号开始的各行为注释,也就是说,这些行对绘图不构成任何影响。下面开始画图。gnuplotsetxlabel月份gnuplotsetylabel降水量(毫米)gnuplotsettitle北京市月平均降水量gnuplotunsetkeygnuplotsetxrange[0.5:12.5]gnuplotsetxtics1,1,12gnuplotplotdatafile.dat12这里我们看