gnuplot详细教程.pdf
《gnuplot详细教程.pdf》由会员分享,可在线阅读,更多相关《gnuplot详细教程.pdf(88页珍藏版)》请在冰点文库上搜索。
使用gnuplot科学作图Gnuplot中文教程版本1.0马欢February9,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.Copyrightc2011HuanMa.欢迎反馈:
115Gnuplot的坐标系统及标签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的版本、系统、版权等信息。
最关键的是最后一条:
Terminaltypesettowxt什么是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语言几乎相同。
对于实数和复数,函数名是一样的。
下面的链接可以看到预定义的函数列表:
http:
/www.gnuplot.info/docs_4.2/gnuplot.html#x1-5300013.1自定义函数自定义函数很容易,例如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)。
引号内的内容为字符串,大多数情况下双引号和单引号没有区别,除非遇到特殊字符(例如换行符n),这时候单引号会把特殊字符当成一般字符处理,而双引号会按照特殊字符的意义将其展开。
这里我们注意到,字符串里也可以包含中文。
究竟是否支持中文,和terminal的种类有关系。
有些terminal对Unicode支持不那么好,这时候显示中文就不那么容易了。
好在我们可以选择那些比较有利的terminal。
现在我们有了一个简单的函数图像了。
虽然看起来还不尽人意,但是没关系,我们以后会把它逐渐完善。
5坐标取值范围及刻度我们从上一讲结束时的图像开始。
这里默认的x取值范围是从-10到10。
我们现在希望x的取值范围从-2到2,这样函数图像可以正好包括十个周期。
横坐标取值范围由xrange参数控制。
还记得gnuplot里面所有参数都由set命令控制吗?
取值范围由方括号内的一对数表示,两个数之间用冒号隔开:
gnuplotsetxrange2pi:
2pignuplotreplot(不要忘记,每一个和x坐标有关的参数,都对应有一个和y有关的参数,所以纵坐标的取值范围由yrange控制。
)现在横坐标取值范围已经符合我们的要求了,但是横轴上的刻度并不是我们想要的。
我们不想要刻度出现在整数位置上,而是希望刻度为的整倍数。
另外,我们还希望两个主刻度之间/2的位置有一个分刻度,分刻度只要有刻度就可以,没必要标出数字了。
gnuplot里面,横轴主刻度和分刻度,分别用xtics和mxtics表示(m表示minor)。
我们试试下面的命令:
gnuplotsetxticspignuplotsetmxtics29gnuplotreplot这里的命令表示:
横轴主刻度间隔为,每两个主刻度之间被分刻度分为2份。
这组命令得到的图像如下:
现在刻度间隔对了,但是显示的数字并不是我们想要的。
我们希望显示字符,而不是小数3.14159。
其实,setxtics命令的形式并不是唯一的。
我们试试下面的形式:
gnuplotsetxtics(22pi,1.5pi1,pi,0.5pi1,00,0.5pi1,pi,1.5pi1,22pi)gnuplotreplot这里setxtics命令直接规定了每个刻度的位置和显示的字符。
每一个刻度对应三个参数:
显示字符、刻度位置、刻度等级。
刻度等级为0时表示主刻度,等级为1时表示分刻度。
对于主刻度(等级为0时),表示等级的参数也可以省略不写。
各个刻度的参数之间用逗号隔开。
从上面的例子我们还看出,显示字符可以为空,也就是只标刻度,不显示字符。
另外,如果命令太长,需要把一条命令分为多行来写,可以在换行时末尾加上反斜杠(),表示这条命令还没有结束。
这组命令得到的图像如下:
10现在横轴坐标已经完全符合我们要求了,我们把纵轴坐标也调整一下,因为我们不需要这么细的划分纵轴刻度:
gnuplotsetytics1,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北京市月平均降水量gnuplotunsetkeygnuplotsetxrange0.5:
12.5gnuplotsetxtics1,1,12gnuplotplotdatafile.dat12这里我们看到,默认的数据作图是画出各数据点。
如果我们希望得到数据连线呢?
可以使用下面的命令:
gnuplotplotdatafile.datwithlineswith命令后面跟的是画图方式,这里使用的是lines方式,也就是把各个数据用直线连接起来。
gnuplot大约支持三十种画图方式,默认为points方式,我们以后会选择一些常用的方式来介绍。
现在问题来了:
如何既得到连线,又得到数据点呢?
对了,用withlinespoints:
gnuplotplotdatafile.datwithlinespoints13好了,我们已经有一个简单的数据图了。
下次我们想办法让它看起来更漂亮一些。
7点线风格我们接着上次的数据图谈起。
上次我们得到了一个“点线”图,它的数据点是由小“+”字表示的,但是似乎太小了,有点看不清楚。
另外,如果我们想在做报告时把这个图用到幻灯片中去,小“+”字很不醒目,这时候我们可能想用其他的标志。
gnuplot里面有几个控制点和线画法风格的参数:
linestyle连线风格(包括linetype,linewidth等)linetype连线种类linewidth连线粗细linecolor连线颜色pointtype点的种类pointsize点的大小我们看下面的例子:
gnuplotplotdatafile.datwithlinespointslinecolor3linewidth2pointtype7pointsize214这几个参数的用法不难理解,直接跟在with命令之后就可以了,但是2、3、7这些数字都代表什么意思呢?
这些数字是代表不同画法风格的代码,具体某个数字代表什么意思,这个依赖于我们使用的terminal(还记得我们在第二讲里曾经讲过的terminal吗?
)拿我们现在正在使用的wxtterminal举例,如果想知道这些数字究竟代表什么意思,可以输入命令:
gnuplottest这样当前terminal会输出一个测试图:
测试图中包含当前terminal的风格代码实例。
例如,左下角显示的是连线粗细,右边显示的是色彩和数据点显示风格对应代码。
最后,告诉大家一个好消息:
gnuplot里面很多命令有缩写形式。
例如上面例子中的绘图命令可以简写为:
gnuplotplotdatafile.datwlplc3lw2pt7ps215至于其他参数命令的缩写形式,相信不难猜出来,大家可以试验一下猜猜看。
8多组数据绘图之前讲了如何用gnuplot进行数据绘图。
实验中经常碰到的情况是,我们要同时处理多组数据。
这一次我们来讲一讲,怎样把多组数据绘制到同一个图上。
还拿城市降水量举例,下面是我们的数据文件,文件名是“precipitation.dat”:
#文件开始#各城市月平均降水量(mm)#月份北京上海#=12.538.125.158.4310.281.3425.4101.6527.9114.3671.1152.47175.3129.58182.9132.1948.3154.91017.861.0115.150.8122.535.6#文件结束#我们在gnuplot里面执行下面的命令:
gnuplotsetxlabel月份gnuplotsetylabel降水量(毫米)gnuplotsettitle各城市月平均降水量gnuplotsetxrange0.5:
12.5gnuplotsetxtics1,1,12gnuplotplotprecipitation.datusing1:
2wlppt5,precipitation.datusing1:
3wlppt716这里我们用了一个新的命令:
using。
在我们的数据文件包含超过一组数据时,我们可以用using指定使用哪列数据。
例如using1:
2表示使用第一列和第二列数据,第一列为横轴,第二列为纵轴。
以此类推,using1:
3表示使用第一列和第三列数据。
如果想把多组数据绘制到一个图上,只要使用一个plot命令,后面跟多组数据,每组数据之间用逗号隔开就可以了。
显然,这里的图例又把图像搞乱了。
我们没有像以前那样把图例去掉,因为这里有两组数据,我们需要保留图例。
怎么办呢?
我们来使用下面的命令:
gnuplotplotprecipitation.datu1:
2wlppt5title北京,precipitation.datu1:
3wlppt7title上海注意到了吗?
这里我们使用了字母u作为using的缩写。
另外,这里用了新的参数title。
这里的title和之前我们用过的settitle不同。
settitle指定的是整个图的标题,而这里的title跟在每一组数据参数后面,指定的是每组数据对应的图例中的title。
这样,我们的图看起来整洁多了。
17using命令除了指定所用的数据列,还可以对数据进行运算操作。
例如,我们现在还是绘制上面的数据,但是降水量单位使用英寸而不是毫米。
我们知道,1英寸=25.4毫米,所以我们执行下面的命令:
gnuplotsetylabel降水量(英寸)gnuplotplotprecipitation.datu1:
($2/25.4)wlppt5title北京,precipitation.datu1:
($3/25.4)wlppt7title上海在对特定列的数据进行运算操作时,我们需要在列号之前加上$符号,这样表示该数据的值。
虽然这里的例子是同一个文件里的多组数据,但是如果数据存在多个文件里,这里的命令同样适用。
9输出eps图片到目前为止,我们所有的gnuplot作图都只是输出到电脑屏幕上。
如果要在我们的文档里使用这些图片,我们必须把它们以某种文件格式存储下来。
前面已经介绍过,gnuplot里面控制图像输出方式的命令是terminal。
我们这次就讲一下如何把图片输出为eps文件。
之所以首先选择eps,是因为大量科学技术文档使用LATEX来编辑排版,而eps是LATEX最常用的图片格式,支持高质量的矢量图形,并且可以方便的转换为pdf、svg等其他常用格式。
首先,让我们看看如何设置terminal。
在gnuplot里输入下面的命令:
gnuplotsetterminalpostscripteps这里的terminal其实是postscript,而eps是作为postscript的一个参数。
这并不奇怪,因为eps本来就是postscript衍生出来的。
输入这个命令之后,gnuplot会自动返回下面的信息:
18这里给出了一些默认的其它参数。
gnuplot下的每一个terminal所带的参数不完全相同,一些参数只针对某一terminal。
我们只需要知道一些常用terminal的常用参数,而其它的terminal和参数,我们可以在使用的时候通过help命令查询。
现在我们暂且不管这些参数,先画一个图试试。
还是用我们上次用过的降水量数据文件:
gnuplotsetxlabelMonthgnuplotsetylabelPrecipitation(mm)gnuplotsetxrange0.5:
12.5gnuplotsetxtics1,1,12gnuplotsetoutputprecipitation.epsgnuplotplotprecipitation.datusing1:
2wlppt5titleBeijing,precipitation.datusing1:
3wlppt7titleShanghaignuplotsetoutputgnuplotsettermwxt这里我们没有使用中文标签,因为在postscript使用中文字体并不容易。
以后我们会介绍如何绕过这个障碍。
第五行有一个新命令:
setoutput。
这没什么多说的,就是指定输出文件的文件名。
第七行还有一个setoutput,但是后面没有跟任何文件名。
这其实是告诉gnuplot,这个文件已经输出完毕,可以关闭了。
另外也可以用unsetoutput,其实是相同作用。
之所以这么做,是因为有些terminal支持多页文件,所以在画完图之后,gnuplot并不自动关闭文件,等待你输入下一页内容,除非你手动关闭,切换terminal,或者退出gnuplot程序。
最后,别忘了把terminal切换回屏幕显示,这样可以避免一些意想不到的事情发生。
注意:
我们又用缩写了!
下面让我们来看看生成的eps文件吧:
19020406080100120140160180200123456789101112Precipitation(mm)MonthBeijingShanghai这个图像可能并不是我们想要的。
有几个地方我们想要修改一下:
这个图是黑白的!
我们想要彩色图。
有一组连线是虚线。
这也难怪,黑白图如果不用虚线,还真分辨不出来。
但我们想要彩色实线。
让直线稍微加粗一点。
标签文字显得小了些,我们想要大一点的字体。
我们来重新画一下这个图:
gnuplotsetterminalpostscriptepscolorsolidlinewidth2Helvetica20gnuplotsetoutputprecipitationcolor.epsgnuplotreplotgnuplotsetoutputgnuplotsettermwxt这里我们用color参数表示我们要彩色图,solid表示我们要实线不要虚线,linewidth参数指定2倍线宽,而最后指定使用Helvetica20号字体。
让我们来看看新生成的eps文件:
20020406080100120140160180200123456789101112Precipitation(mm)MonthBeijingShanghai这里的字体为postscriptlevel2字体,共有35种。
除了Helvetica,常用的还有Times-Roman。
如果硬要多记两个字体名字,就记住Courier和Symbol吧。
Courier是编程时常用的等宽字体,而Symbol字体可以用来显示希腊字母。
如果你实在好奇还有哪些其它字体,可以看看下面的网页链接:
http:
/xfig.org/userman/attributes.html#font-panel10输出pdf和png图片这次讲讲怎样把图片输出为pdf和png格式。
上次讲过的eps文件其实很容易转换为pdf,为什么我们还专门讲一下pdf格式输出呢?
因为在postscriptterminal下很难使用中文字体,而在pdf下面就容易多了,而pdf文件又很容易转换回eps,这样就绕开了eps中文支持不好的问题。
png是一种无损压缩位图格式,图形质量优于jpg等有损压缩格式,支持透明效果,可以生成非常小体积的文件,适于放在网上交流。
通过各种图像处理软件,png文件也很容易转换为其他位图格式。
下面首先看一个pdf输出的例子,咱们还是用之前用过的城市降水量数据文件:
gnuplotsetxl