Top: Table of contents
Next: Chapter 6. Input, Output
Previous: Chapter 4.Plotting environment

Chapter 5. Plotting

GNUPLOT 以函数或数据资料为绘制图形的来源。此两者皆使用 plot(splot) 指令绘图,plot 用于绘制 2 维的函数或数据资料;而 splot 则用以绘制 3 维空间 中的曲面。其基本语法为:

    plot {ranges} {<function> | {"<datafile>" {using ...}}}
                  {title} {style} {, <function> {title} {style}...}

    splot {ranges} {<function> | {"<datafile>" {index i} {using ...}}}
                   {title} {style} {, <function> {title} {style}...}

由修改各参数的设定,可产生许多种表达图形的方式。 其参数的设定大致分为以下四类:

  1. range : 设定图形所显示的区域。
  2. function or datafile : 设定所绘的函数或存有 数据资料的档案。
  3. title : 设定标题内容。
  4. style : 设定显示图形的颜色、图案等。
以下分别描述之。

5.1 Ranges

设定此次 plot(splot) 所显示的范围。在设定绘图环境中亦有 xrange、yrange、 zrange、rrange、trange、urange、vrange 等相似功能的参数可加以设定, 但其影响设定后所有的绘图状态。设定 range 的语法为:

    [{<dummy-var> =} {<xmin> : <xmax>}] { [{<ymin> : <ymax>}] }

其中参数 <dummy-var> 为变数名称 (预设为 X Y,可由 set dummy 而更改), 而 min 和 max 则是设定显示范围,均为常数表示式。并非 min 和 max 要同时存在, 不设定表示不改变此项数值。一但设定了 range 之后,会自动将 autoscaling 关闭。 以下是一些范例:

  plot cos(x)                          # 使用目前的 range。
  plot [-10:30] sin(pi*x)/(pi*x)       # 设定 X range。
  plot [t = -10 :30]  sin(pi*t)/(pi*t) # dummy-variable 改成 t,设定 t range。
  plot [-pi:pi] [-3:3]  tan(x), 1/x    # 设定 X 和 Y range。
  # 仅设定 Y range,但关闭 X 轴 、Y 轴 的 autoscaling。
  plot [ ] [-2:sin(5)*-8] sin(x)**besj0(x) 
  plot [:200] [-pi:]  exp(sin(x))      # 仅设定 xmax 和 ymin。
  splot [0:3] [1:4] [-1:1] x*y         # 设定 X、Y、Z range。


5.2 Function

函数为一数学表示式。可以是 GNUPLOT 提供的函数或是自行定义或合成的函数。 若使用参数式 (parametric function),则可能是一对 (使用 plot) 或 3 个 (使用 splot) 数学表示式。要注意的是 dummy variable 必须符合当时所设定的, 一般为 X、Y、Z,若为参数式则为 t (2 维) 或 u v (3 维)。以下是一些范例:

  plot sin(x)   # 描绘数学三角函数 sin(x)。
  splot x * y   # 描绘函数 x*y。


5.3 Datafile

GNUPLOT 依照档案中的数据,逐点描出图形。表4 即是一组数据资料。

#
#  datafile.example 
#
0       11.062  9.757   12.667  2.345
2       9.212   8.0908  10.932  1.725
5       8.55    7.6612  9.0388  2.846
10      8.122   7.327   8.617   0.957
15      8.156   7.6101  8.9019  1.577
20      8.122   7.5431  8.8009  3.141
25      7.988   6.3007  9.2753  1.57
27      8.096   6.665   10.555  2.172
29      7.936   6.9395  8.325   0.582
30      7.854   6.4909  9.8171  0.603
35      8.01    7.1556  8.644   1.063
40      8.02    7.0301  9.7099  2.152
45      8.092   6.9164  9.7676  1.44
50      8.072   7.2993  8.4447  1.96
60      8.286   7.7265  8.755   1.0
表4: An example of datafile.(I)

数字之间以空白或 tab 区别。每笔数字为一栏位,每行则由几个栏位构成, 储存组数字,描绘数据图形的基本语法为

    plot "datafile" { using { <ycol> |
                              <xcol>:<ycol> |
                              <xcol>:<ycol>:<ydelta> |
                              <xcol>:<ycol>:<ylow>:<yhigh> |
                              <xcol>:<ycol>:<ylow>:<yhigh>:<boxwidth> }
                            {"<scanf string>"} } ...

    splot "datafile" { using { <xcol>:<ycol>:<zcol> | <zcol> }
                             {"<scanf string>"} } ...

plot "datafile" with lines即能产生如图23 的 结果。此例中 GNUPLOT 依序用线条连接档案 "datafile" 内各点数据所定出的座标值。 将第一栏位视为 X 座标值,将第二栏位视为 Y 座标值。表4 为一组资料档案。参数 <xcol> <ycol> 和 <zcol> 均为在档案中选择适当的栏位分别做为 X、Y、Z 的座标值。 如在 plot 语法中第一行仅用 <ycol> 则以档案中的行数代替 X 座标值 绘出图形。第二行则为同时标出 X、Y 座标值。第三、四行为画 errorbars 时 使用 <ydelta>、<ylow> 及 <yhigh>。第五行为画 boxes 或 boxerrorbars 时使用,可设定 box 的宽度;此时若以 boxes 为图样 (即不必使用 <ylow> 及 <yhigh>),亦要设定 <ylow> 及 <yhigh>。图13 即是使用表4 为 datafile 运用不同 叙述所绘的结果。

set xrange [-1 : 15]
plot "datafile" using 2 
plot "datafile" using 1:2 
set xrange [-3 : 65]
plot "datafile" using 1:2:5 with errorbars
set xrange [-3 : 65]
plot "datafile" using 1:2:3:4 with errorbars

图 12: Plotting unsorted and sorted data

plot 语法中第六行是采用 C 语言中 scanf 读入浮点数字的 语法 %f 来表达使用数字的情形。

      plot "datafile" using "%*f%f%*20[^\n]%f" with lines

是忽略第一行栏位的数字,采用第二栏位的数字为 X 座标值,再忽略 20 个 非换行字元的文字,再将接者的数字做为 Y 座标值。这样就可忽略数字之间的文 字说明了。如 6.2.3 节中由设定输出为 table 所产生的资料 档案 "datafile" 。可用

    plot "datafile" using "%*4[^\n]%f%3[^\n]%f" with lines

得到 "datafile" 所描述的图形。使用 %*4[^\n] 忽略前四个字 "i x=" %*3[^\n] 忽略 " y=" 三个字。

储存档案中的数据或许未按大小顺序排列者,此时使用 "points" 为图样画出数据 尚无影响。但若使用 "lines" 为图样画出数据,则图形显得杂乱。如图12 左半部,此时可用 unix 指令

    sort -n data.old > data.new 

将数据依顺序,由小而大排列。则将图12 左半部改成图12 右半部。


图 12: Plotting unsorted and sorted data

这方法适用于 2 维上的绘图,至于 3 维上绘图 则须设定 dgrid3d 此项参数。

在一档案中亦可包含几个数值资料图形,只要在不同数值资料图形之间以两行 空白隔开,就可仅画其中一个数值资料图形(仅能运用于画 3D 图形)。范例如下:

    splot "datafile" index 0 

datafile 内容如表5 ,index 0 表示画第一个数值资料图形。 此时若要画第三个图形,可使用 index 2。


#  index 0
0  11.062   9.757
2   9.212   8.0908 
     .
     .


#  index 1
10   8.122  7.327
15   8.156  7.6101
      .
      .


#  index 2
25   7.988  6.3007
27   8.096  6.665
      .
      .
表5: An example of datafile.(II)


5.4 Style

GNUPLOT 描绘数据资料图形是以读入档案中的座标值后,以图样绘上。 而描绘函数图形是计算若干点的函数值后,以某种图样将函数值绘上。 一般是取样 100 点及采取线条作为图样。GNUPLOT 可提供 9 种图样,分别是


图14: Various plotting style

若改变图样,则可得到不同形式的输出。图14 以九种图样为范例分别 绘出数值资料图形。其中 errorbars, steps, boxesboxerrorbars 仅能在平面 (2D) 上使用。在设定绘图环境之中, 亦可由 set function style 和 set data style 分别设定描绘函数与数据资料 的图形,得到相同的结果。

设定图样的语法为

    with <style> {<linetyle> {<pointtype>}}

其中参数 <style> 为 lines, points, linespoints, impulses, dots, steps, errorbars 之中一种, 参数 <linetype> 和 <pointtype> 均为一正数,分别选定绘图颜色及 画 points 的符号。GNUPLOT 提供 <linetype> 和 <pointtype> 各六种选择,供绘图循环使用。以下举出一些使用范例:



5.5 Title

一般使用 GNUPLOT 绘图时,会将函数名称或存有数据资料的档案名称设定为 title。我们可用

    title "<title>"
改变 title。如图14 中即是运用
    plot "datafile" title "style : lines" with lines
将名称由描述档案名称改为描述图案名称。我们亦可使用 "notitle" 使 title 不出现。 如
     plot my_function(x), 1 notitle
不将函数名称 "1" 显示在图形上,而得到 y=1 直线,而这条直线可作为辅助线。



Top: Table of contents Next: Chapter 6. Input, Output