前言
因为目前我主要用gnuplot来显示二维曲线,只用到了一部分的功能,所以这里也只介绍一些简单的功能,如果有其他需求,可以参考官网的demo:http://gnuplot.sourceforge.net/demo_5.4/和用户手册。后续如果我有用到其他指令再进行补充。
二维画图的主要指令是plot,曲线的样式设置跟在plot之后;其他选项都可以通过set <关键字> <参数>的形式进行设置,包括坐标轴、图例、网格线等。下面一一介绍。
gnuplot的指令可以使用缩写,比如term是terminal的缩写、lc是linecolor的缩写等,但是因为刚上手,我更加习惯使用全称,也免得后续不常用而看不懂自己写的命令。
一、设置显示格式、窗口大小及位置
gnuplot支持多种格式显示,可以输入"set terminal"命令查看所有支持的显示格式。我在Windows上安装的gnuplot5.4.1支持的所有显示格式如下截图:
指定显示格式,及窗口或者图片的大小、在屏幕中显示位置的命令为:
set terminal <terminal_type> {size <width>, <height>} {position <x>, <y>}
terminal_type是上面截图中的类型,我最常用的是wxt,是以交互式窗口的形式弹出来的;width和height分别表示宽和高,单位是像素;x和y一起表示在屏幕上的位置,单位同样是像素,0,0表示屏幕左上角,100,50表示窗口左上角以屏幕左上角为原点向右偏移100像素、向下偏移50像素。可以参考示例(我的屏幕分辨率为1920×1080):
gnuplot>set terminal wxt size 1000, 600 position 100, 50
gnuplot>plot sin(x)
size和position可以缺省,也就是说可以单独使用"set terminal <terminal_type>"来设置显示格式,同时也并非所有显示格式都支持size和position的设置,另外不同的显示格式有很多其他的选项可以自行配置,具体描述可以参考用户手册的“Ⅳ Terminal types”部分。
二、二维图绘制基本指令
绘制二维曲线的主要命令是plot,可以用来绘制函数或者离散数据点,并指定每条曲线的样式和标题等,基本指令格式为:
plot <function/data> {with <style>} {<property> <property_value>} {title "<line_title>"}
gnuplot绘制二维曲线有多种样式,最常用的是画线"with lines"、画点"with points"或者带标记点的线"with linespoints";可以设置的属性property包括线型、线宽、颜色、标记及其大小等,属性可以按需配置,只需按照属性关键字+值的组合方式列出即可,且没有顺序要求;title用来指定曲线的名称,主要用于在图例中显示。如果想要在一个图中绘制多条曲线,则只需在指令后加上逗号并重复要绘制的函数或者数据以及样式,例如"plot sin(x) with lines, cos(x) with points, tan(x)"。
除了线和点之外,gnuplot还可以使用很多其他的样式进行绘图,比如箭头Arrows、标签Labels、框Boxes等,具体可以参考用户手册的“Ⅱ Plotting styles”部分。
1. 设置线型
如果选择画线,可以进一步指定画实线(实线是默认的样式)或者画虚线;如果画虚线,有多种预设的虚线线型,也可以自定义。命令如下:
plot <function/data> with lines #使用实线,同时也是默认样式
plot <function/data> dashtype <index> #使用预设的虚线线型
plot <function/data> dashtype "<pattern>" #使用自定义的虚线线型,可以由点.横杠-下划线_和空格组合
不同版本的gnuplot在不同显示格式(terminal)下提供的预设虚线类型可能不一样,gnuplot 5.4.1 wxt terminal一共有5种预设的虚线线型(实际应该算4种,因为dashtype 1就是实线):
也可以使用由“点.、横杠-、下划线_以及空格”组成的自定义虚线线型,-和_下划线的区别就是长短不一样:
gnuplot>plot sin(x) dashtype "-. _"
2. 设置标记
如果选择画点,可以进一步指定点的标记,同样有多种预设的标记,也同样可以自定义。命令如下:
plot <function/data> with points pointtype <index> #使用预设的标记
plot <function/data> with points pointtype "<pattern>" #使用自定义的标记
gnuplot 5.4.1 wxt terminal一共有15种预设的标记点,包括十字+、叉号×、星号※、正方形、圆形、正三角、倒三角、菱形、倒五边形,后面六种形状又分别包括空心和实心两种。如果想了解当前terminal下所有预设设置,可以在窗口中直接输入"test"查看(下图最右侧就是预设的颜色及标记点):
自定义的标记可以是一些字符:
gnuplot>plot sin(x) with points pointtype "p", cos(x) with points pointtype "#"
3. 同时设置线型和标记
如果选择同时画线和标记点,则可以将上述两个命令结合起来指定线型和标记:
plot <function/data> with linespoints pointtype <index> #带标记点的实线
plot <function/data> with linespoints dashtype <index> pointtype <index> #带标记点的虚线
当然除了使用预设的线型和标记点之外,也同样可以使用自定义的样式。效果如下:
gnuplot>plot sin(x) with linespoints pointtype 3, cos(x) with linespoints dashtype 3 pointtype "o"
4. 设置线或者标记的颜色
如果同时画多条曲线,gnuplot会使用预设的颜色依次显示每一条曲线,但是也可以自己指定颜色。命令如下:
plot <function/data> with ... linecolor "<color_name>"
支持的显示颜色可以输入"show colornames"查看:
color_name可以是颜色名如blue/red等,也可以是x11格式的颜色名称,就是上面截图中有#的那一串字符。可以参考以下示例:
gnuplot>plot sin(x) linecolor "royalblue", cos(x) with points linecolor "#ffc020"
5. 设置线宽或者标记的大小
如果画线,可以设置线宽,命令如下:
plot <function/data> with lines linewidth <n>
如果画点,可以同时设置标记的线宽和大小,命令如下:
plot <function/data> with points linewidth <n> pointsize <m>
两者的不同可以通过以下示例来体现:
gnuplot>plot x with points pointtype 4 linewidth 1 pointsize 2 title "lw1 ps2", x+1 with points pointtype 4 linewidth 2 pointsize 1 title "lw2 ps1", x+2 with points pointtype 4 linewidth 2 pointsize 2 title "lw2 ps2"
6. 设置曲线的名称
设置曲线标题的目的是用于区分每条曲线,在图例中显示(图例的设置命令为set key,后面介绍);如果设置不显示图例(set key off或者unset key),那么曲线的标题将不会在图中体现。如果不设置标题的话,会默认使用plot之后的函数名或者数据名作为标题;如果某条曲线不用显示图例,可以用notitle。命令如下:
plot <function/data> with ... title "<title_name>"
plot <function/data> with ... notitle
可以参考以下示例:
gnuplot>plot sin(x), cos(x) title "cosine", x/2 with points notitle
三、二维绘图选项配置
使用set命令可以设置很多选项,使用“unset+选项关键字”命令则可以解除设置。如果想要查看某一个选项的当前值,可以使用“show+选项关键字”命令;如果想要查看所有可供设置的选项及当前值,可以在窗口中输入show all查看。
set命令设置了选项后,一直到plot命令画图后才会显示。
所有可以设置的选项可以参考用户手册的“Ⅲ Commands”部分的“Set-show”介绍。下面仅介绍一些我用到过的选项。
1. 图像标题及其字体、大小、颜色
使用set title可以生成一个位于图像上方居中的标题,命令如下:
set title "<title_name>" font "<font_name>, <font_size>" textcolor "<color_name>"
font用来设置标题的字体和大小,font_name是标准的字体名如Arial, Times New Roman, Courier等,如果只想要指定字体的大小,font_name缺省就可以,即font ", <size>";textcolor用来设置字体的颜色,color_name可以参考上面的linecolor;font和textcolor无需按顺序排列,按需设置即可。
可以参考以下示例:
gnuplot>set title "function title" font "Times New Roman, 12" textcolor "red"
gnuplot>plot sin(x)
2. 坐标轴名称及其字体、大小、颜色
设置坐标轴名称的命令格式与设置图像标题set title类似:
set xlabel/x2label/ylabel/y2label "<label_name>" font "<font_name>, <font_size>" textcolor "<color_name>"
gnuplot支持多轴显示,可以分别给每个坐标轴指定标签,字体、大小、颜色的设置与title相同。xlabel是下方x轴,x2label是上方x轴;ylabel是左方y轴,y2label是右方y轴。示例如下:
gnuplot>set title "function title" font "Times New Roman, 12" textcolor "red"
gnuplot>set xlabel "xaxis" font ",8"; set ylabel "yaxis" textcolor "purple"
gnuplot>plot sin(x)
3. 图例
使用set key可以设置图例(legend)的显示方式,常用的一些配置参数如下:
set key on/off
inside/outside
left/right/center
top/bottom/center
vertical/horizontal
font "<font_name>, <size>" textcolor "<color_name>"
box/nobox
on/off用来控制是否显示图例,默认为显示图例,另外还可以使用unset key命令来关闭图例,如果想要设置的所有参数恢复为默认,可以使用set key default命令;
inside/outside、left/right/center、top/bottom/center用来控制图例的显示位置,inside是在坐标轴区域内,outside则是在外面,left/right/center分别表示左侧/右侧/中间,top/bottom/center分别表示顶部/底部/中间,默认的显示位置是内部右上方,即“inside right top”,这三个并不一定全部要显式设置,且无需按顺序排列,假设仅设置为outside,那其他两个会使用默认值,图例会显示在外侧的右上方;
vertical/horizontal用来控制多条曲线图例的显示方式,vertical为垂直排列,horizontal为水平排列,默认为垂直排列;
font和textcolor用来控制图例的字体、大小及颜色,设置方式与前面的相同;
box/nobox是值是否有外框,默认无框。
可以参考以下示例:
gnuplot>set key outside bottom right horizontal box
gnuplot>set xrange [-pi:pi]
gnuplot>plot sin(x), cos(x), x*x
4. 坐标轴范围
使用set range可以设置坐标轴的显示范围,命令如下:
set xrange/x2range/yrange/y2range [<min>:<max>]
xrange是下方x轴,x2range是上方x轴,yrange是左方y轴,y2range是右方y轴。设置的范围就是指定的min到max,可以参考上面的示例设定x轴的显示范围为-pi到pi。
使用set autoscale可以设置坐标轴的自动缩放,命令如下:
set autoscale
set autoscale x/x2/y/x2
直接用set autoscale可以自动缩放所有坐标轴,加上x/x2/y/y2后可以缩放指定坐标轴。
5. 坐标轴刻度及标签
使用set tics可以设置坐标轴的刻度及标签,命令如下:
set xtics/x2tics/ytics/y2tics mirror/nomirror
<start>,<increment>,<end>
(<position1>,<position2>,...)
("<label1>" <position1>,"<label2>" <position2>,...)
font "<font_name>,<font_size>" textcolor "<color_name>"
mirror是指在坐标轴的镜像位置放置相同的刻度线(没有标签),xtics是下方x轴,x2tics是上方x轴,ytics是左方y轴,y2tics是右方y轴,默认xtics和ytics是带mirror的,而x2tics和y2tics是nomirror的。可以参考以下两图的效果:
gnuplot>set xtics mirror; set ytics mirror; plot sin(x)
gnuplot>set xtics nomirror; set ytics nomirror; plot sin(x)
start, increment, end构成了一个序列,指定坐标轴刻度和标签将从start开始,按照increment的增量直到end为止,可以参考以下示例:
gnuplot>set xrange [-pi:pi]
gnuplot>set xtics -pi, pi/2, pi
gnuplot>set ytics -1, 1, 1
gnuplot>plot sin(x)
另外一种更随意地指定特定刻度的方式是直接以列表的方式列出来,即set xtics (<position1>, <position2>, ...);如果想要指定标签,则在前面加上特定的"label"即可,即set xtics ("<label>1" <position1>, "<label2>" <position2>, ...)。可以参考以下示例:
gnuplot>set xrange [-pi:pi]
gnuplot>set xtics ("-pi" -pi, "-pi/2" -pi/2, "0" 0, "pi/2" pi/2, "pi" pi)
gnuplot>set ytics (-1, 0,1)
gnuplot>plot sin(x)
使用font和textcolor可以设置标签的字体、大小和颜色,与标题和坐标轴名称的设置方式相同。
6. 网格
使用set grid可以设置是否显示网格线,命令如下:
set grid xtics/x2tics/ytics/y2tics <line-properties>
set grid noxtics/nox2tics/noytics/noy2tics
set grid xtics/x2tics/ytics/y2tics可以显示指定坐标轴的网格线,xtics是下方x轴,x2tics是上方x轴,ytics是左方y轴,y2tics是右方y轴,也可以设定网格线的颜色线宽(但是并非针对指定坐标轴的网格线,而是所有的网格线);前面加上no则是不显示指定坐标轴的网格线,默认是不显示任意网格线的。
可以参考以下示例:
gnuplot>set grid xtics ytics linecolor "purple" linewidth 1
gnuplot>plot sin(x)