到目前为止,我们所有的gnuplot作图都只是输出到电脑屏幕上。如果要在我们的文档里使用这些图片,我们必须把它们以某种文件格式存储下来。前面已经介绍过,gnuplot里面控制图像输出方式的命令是 terminal。
输出到电脑屏幕:
gnuplot> set terminal wxt
输出为 eps 文件。
gnuplot> set terminal postscript eps
所以首先选择 eps,是因为大量科学技术文档使用 LaTeX 来编辑排版,而 eps 是 LaTeX 最常用的图片格式,支持高质量的矢量图形,并且可以方便的转换为 pdf、svg 等其他常用格式。输入这个命令之后,gnuplot会自动返回下面的信息:
还是用我们上次用过的降水量数据文件:
gnuplot> set xlabel "Month"
gnuplot> set ylabel "Precipitation (mm)"
gnuplot> set xrange [0.5:12.5]
gnuplot> set xtics 1,1,12
gnuplot> set output "precipitation.eps"
gnuplot> plot "precipitation.dat" using 1:2 w lp pt 5 title "Beijing", "precipitation.dat" using 1:3 w lp pt 7 title "Shanghai"
gnuplot> set output
gnuplot> set term wxt
第五行有一个新命令:set output。这没什么多说的,就是指定输出文件的文件名。第七行还有一个 set output,但是后面没有跟任何文件名。这其实是告诉gnuplot,这个文件已经输出完毕,可以关闭了。另外也可以用 unset output,其实是相同作用。之所以这么做,是因为有些 terminal 支持多页文件,所以在画完图之后,gnuplot并不自动关闭文件,等待你输入下一页内容,除非你手动关闭,切换 terminal,或者退出gnuplot程序。
这个图像可能并不是我们想要的。有几个地方我们想要修改一下:- 这个图是黑白的!我们想要彩色图。
- 有一组连线是虚线。这也难怪,黑白图如果不用虚线,还真分辨不出来。但我们想要彩色实线。
- 让直线稍微加粗一点。
- 标签文字显得小了些,我们想要大一点的字体。
我们来重新画一下这个图:gnuplot> set terminal postscript eps color solid linewidth 2 "Helvetica" 20
gnuplot> set output "precipitation-color.eps"
gnuplot> replot
gnuplot> set output
gnuplot> set term wxt这里我们用 color 参数表示我们要彩色图,solid 表示我们要实线不要虚线,linewidth 参数指定2倍线宽,而最后指定使用 Helvetica 20 号字体。让我们来看看新生成的 eps 文件:
这里的字体为 postscript level 2字体,共有35种。除了 Helvetica,常用的还有 Times-Roman,Arial。如果硬要多记两个字体名字,就记住 Courier 和 Symbol 吧。Courier 是编程时常用的等宽字体,而 Symbol 字体可以用来显示希腊字母。如果你实在好奇还有哪些其它字体,可以看看下面的网页链接:
我用了Arial字体,adobe illustrator 打开eps文件时,没有报字体错误。eps图片插入word时,容易出错。我用word 2013 时,可以插入eps。word2010及以下版本可能插入出错。
上次讲过的 eps 文件其实很容易转换为 pdf,为什么我们还专门讲一下 pdf 格式输出呢?因为在 postscript terminal 下很难使用中文字体,而在 pdf 下面就容易多了,而 pdf 文件又很容易转换回 eps,这样就绕开了 eps 中文支持不好的问题。
png 是一种无损压缩位图格式,图形质量优于 jpg 等有损压缩格式,支持透明效果,可以生成非常小体积的文件,适于放在网上交流。通过各种图像处理软件,png 文件也很容易转换为其他位图格式。下面首先看一个 pdf 输出的例子,咱们还是用之前用过的城市降水量数据文件:gnuplot> set xlabel "月份"
gnuplot> set ylabel "降水量(毫米)"
gnuplot> set title "各城市月平均降水量"
gnuplot> set xrange [0.5:12.5]
gnuplot> set xtics 1,1,12
gnuplot> set term pdfcairo lw 2 font "Times New Roman,8"
gnuplot> set output "precipitation.pdf"
gnuplot> plot "precipitation.dat" u 1:2 w lp pt 5 title "北京", "precipitation.dat" u 1:3 w lp pt 7 title "上海"
gnuplot> set output这里我们用的 terminal 是 pdfcairo,而不是简单的 pdf。区别是 pdfcairo 使用了 cairo(一个2D图形程序库)和 pango(一个字体渲染程序库)来生成 pdf 文件,优点是更好的国际支持。有了之前的经验,这里的 terminal 参数不需要多解释了。这里我们使用了“Times New Roman” 8号字体。和 eps 下使用 postscript 字体不同,这里可以是电脑系统里安装的任何字体。在 Linux 下,可以使用 fc-list 命令察看系统里到底有哪些字体可用。下面我们来看生成的 pdf 图片:
这里有一个小问题:虽然数字使用了Times New Roman字体,但是汉字使用了其他字体(这里是我的系统默认的“文泉驿正黑”)。这是因为Times New Roman本来就不是中文字体。如果我们想让中英文混排时字体统一,必须使用支持中文的字体。下面我们来看 png 输出的例子:gnuplot> set term pngcairo lw 2 font "AR PL UKai CN,14"
gnuplot> set output "precipitation.png"
gnuplot> replot
gnuplot> set output
gnuplot> set term wxt基于和上面同样的原因,这里使用的 terminal 是 pngcairo 而不是简单的 png,而字体是 AR PL UKai CN(文鼎简中楷)。下面是生成的 png 图片:
enhanced 文本模式
如果我们希望输出稍复杂一点的文字标签,例如字母加角标,我们可以使用 enhanced 文本模式。,使用方法就是在 set terminal 的时候,在后面加上 enhanced参数。enhanced 模式里有一些表达特殊含义的字符,利用这些字符可以构成一些比较复杂的文字输出。这些特殊字符主要包括:- ^:表示后面的字符为上角标
- _:表示后面的字符为下角标
- @:表示后面的字符不占任何宽度
- &{"string"}:表示一段空白,空白的长度等于花括号内那段字符串所占宽度
- ~:表示后面的两个字符重叠打印(相当于打字机在同一位置打印两个字符);也可以在第二个字符前加上一个数字,表示第二个字符相对于第一个字符有一个竖直方向的移动,移动距离等于该数字乘以字符尺寸。
上面提到的“字符”,也可以是包含在花括号 {} 内的“字符串”。除了上面这些特殊标志,还可以临时改变字符(或字符串)的字体,方法是:{/字体名=字体大小 字符}下面我们看一些例子:- "a^x"
- "a_x"
- "a^b_{cd}"
这里的上下角标没有对齐,因为上标 b 需要占一定宽度
- "a^@b_{cd}"
这里我们看到了 @ 的作用
- "abc&{de}fg"
这里 & 后面的字符没有显示,留出一段和这些字符同样宽度的空白
- "~a{1.2\\_}"
注意这里的两个反斜杠。因为下横杠(_)是一个特殊字符,需要在前面加反斜杠 \ 来表示它本来的意义,而反斜杠本身也是一个特殊字符,需要在它前面再加一个反斜杠。我们在第四讲里谈到过双引号和单引号的区别。如果我们在这里用单引号而不是双引号,那么只需要一个反斜杠就可以了。这里的 1.2 表示后面的字符(_)向上移动 1.2 个字符大小的距离。
- {/Symbol abc}abc
这里第一个花括号里的 abc 使用了 Symbol 字体,而后面括号外的 abc 使用的是默认字体。注意字体名称前的斜杠方向。这里我们看到,Symbol 字体里的英文字母对应显示的是希腊字母。Symbol 字体里还包括了一些其它符号,下面是完整的 Symbol 字体列表:
上面图中显示的是 Symbol 字体对应的16进制代码。例如上面例子中的希腊字母 αβχ,对应的16进制代码分别为 61、62、63,转换为8进制代码就是 141、142、143。在 gnuplot 里,我们可以直接用字符的8进制代码表示这个字符,所以我们也可以用 {/Symbol \141\142\143} 来表示 αβχ。
根据上面的内容,下面是一个综合起来的例子:gnuplot> set term wxt enhanced
gnuplot> set xlabel "X"
gnuplot> set ylabel "Y"
gnuplot> set xrange [0:10]
gnuplot> set xtics 0,1,10
gnuplot> unset key
gnuplot> set title "f(x) = {/Symbol=16 \326}~{x^@3}{1.1{/Symbol=16 \276}}&{aa}函数图像"
gnuplot> plot sqrt(x**3)
虽然利用 enhanced 模式也能显示一些简单的数学表达式,但是对于稍微复杂一点的公式来说,显示效果无法令人满意。要在gnuplot里显示数学公式,终极方案还是要用 LaTeX。