linux中使用gnuplot使您的数据可视化

基础

通过在 shell 命令提示符中输入 gnuplot 启动 gnuplot。您首先看到提示符号 >。该提示符是进入 gnuplot

的输入点;Linux 用户将习惯于这种方式。例如,您可以使用方向键来查找以前输入的命令历史记录,然后编辑和重新执行这些命令;Home 和 End

键与平时使用没有区别。可以对 gnuplot 进行重新编译以便使用 GNU readline 库在输入提示符上来回移动,但类似于默认函数。

Gnuplot 提供了广泛的在线帮助,如果您要做任何有用的事情,则肯定会用到这些在线帮助。语法是统一的:通过输入 help图 1. sin(x)

我们刚刚创建了可能是最简单的图。让我们看看如何以不同方法定制该图。假设我们只想看到一个正弦曲线周期。我们通过限制图的默认 x

范围来完成此操作。使用表示法 [min:max] 来指定范围。要仅指定最小值,使用 [min:];要仅指定最大值,使用

[:max]。数学上称此为所谓的“闭”区间表示法。

这里我们使用 [-pi:pi] 得到一个正弦曲线周期:

清单 1. 从 -pi 到 +pi 的 sin(x)

set xrange [-pi:pi]

replot

reset图 2. 重绘正弦曲线图

我们刚才使用了 replot 命令,它执行先前的 plot

命令。当您绘制曲线图且需要不断对该图进行修改以添加想要的特征时,此命令会非常有用。另外,replot 使您可以添加更多的图。尝试输入

replot cos(x)。依照语法,该命令等同于 plot sin(x), cos(x)。Replot

就是获取先前的绘图字符串,添加必要的逗号,然后附加输入给它的其余部分。

使用的最后一个命令 reset 对于绘制正弦曲线不是必要的。它移除先前所有 set 命令的效果并恢复默认值。因此,在本例中,它将使用默认 x 范围。

现在让我们尝试一些更奇特的东西:plot sin(x)/x。您应该看到如下所示图形:图 3. sin(x)/x

从刚才这三个简单的例子,您可以看到 gnuplot 能够理解 pi

并具有丰富的自带数学函数词汇表。它甚至知道非常有用的管理正态分布的统计函数,以及深奥的特殊函数,如朗伯、贝塞尔、beta 和 gamma

函数(还有更多!),这些函数通常仅在 mathematica 等功能齐全的数学工具中才会有。根据经验,语法与 C 中的语法相似,C

中的语法又与平常数学中使用的语法相似。(一个重要的不同是指数的表示法:为了方便,x 的 y 次幂写为 x**y)。

接着,将图命名为(“My First Graph”),并命名轴(x 轴是“angle, in degrees”,y 轴是“sin(angle)”)。

清单 2. 命名图和轴

set title "My first graph"

set xlabel "Angle, /n in degrees"

set ylabel "sin(angle)"

plot sin(x)

注意 xlabel 中的 /n 会产生新的一行。一般来说,gnuplot 在双引号内的字符串中进行类似于 C 的反斜杠处理。Windows

用户注意:如果您想文件名使用双引号括起来的字符串表示,则必须使用两个反斜杠:如

"c://developerworks"(或者可以使用一个正斜杠:"c:/developerworks")。

现在,我

们注意到 x 轴实际没有标记为度数,看起来不是很好。要修改此问题,通过调整 x 轴上的 tic 标记,使指定的(主)标记仅以 90

度增加和辅标记以 45 度增加。主 tics 的“级别”为 0,这是默认值;辅 tics 的级别为 1。每个点分别由一个 3

元组指定:"label"(放在引号中)、

清单 3. 改变轴上 tic 并设置网格

set xrange [-pi:pi]            # we want only one cycle

set xtics ("0" 0,     "90" pi/2, "-90" -pi/2, "" pi/4 1, "" -pi/4 1, "" 3*pi/4 1, "" -3*pi/4 1)

set grid

set xlabel "Angle,/n in degrees"

set ylabel "sin(angle)"

plot sin(x)图 4. 带有 tics、标题、网格和标签的轴的 sin(x)

注意对 +45 度和 -45 度辅标记使用了空标签 ("")。还要注意我们不必以任何顺序列出点。像 gnuplot

中的其他所有项一样,xtics 命令功能非常多,具有方便的选项,用于以固定增量创建 tic

标记(在对数标度中为正常倍数),以及用于时间相关数据的特殊格式。查看 help set xtics 中的例子可以获得更多信息。

作为边注,注意我们使用反斜杠将 xtics 命令扩展成多个输入行。这样可以使比较长或比较复杂的命令更易读懂。

我们还用 set grid 来设置网格,该命令使您可以从数量上查看图。到现在为止,我们大量地使用了 set 命令。Gnuplot

有一种撤销设置的统一方法:在 gnuplot 4.0 中,命令是 unset。例如,如果您不想要网格,使用 unset grid。4.0

以前的版本,命令是 set nogrid。

顺便说一下,我们提供的所有例子都可以在交互模式或批处理模式下运行。要以交互

模式运行,在提示符中输入每个命令。要以批处理模式运行,将命令输入或添加到文本文件中,然后在 gnuplot 提示符中使用 load

'filename' 读入文件,或者在 shell 提示符下将其作为参数提供给 gnuplot:$ gnuplot

filename。使用第二种方法,gnuplot

会在执行输入文件中的所有命令后退出,所以当直接绘图到文件中(请参见下一节)时,采用批处理模式执行特别有效。如果在屏幕上绘图时使用第二种方法,输出

窗口一出现(当 gnuplot 退出时)就会消失,所以您需要使用显式的“pause -1”命令(请参阅 help pause)来保持窗口。

批处理模式操作中使用的 Gnuplot 命令文件往往停留一会,从而帮助使用注释来提高可读性。# 后面的直到行结束的内容是注释。所以在示例清单 3 中,gnuplot 不处理 we want only one cycle。

终端设备 ―― 题外话

在启动时,您可能注意到终端类型设置为 X11。Gnuplot 采用标准设计,可以在多个终端设备上绘图。这包括直接打印到多种打印机中,包括

Epson、HP 和 Imagen 打印机。它甚至可以在伪设备中绘图,如 postscript 和

png。这主要涉及生成输出文件,而不是可查看文件或打印输出。这是将您的图表包含在其他报表中的一种技巧。虽然我还没有发现在 Windows 中与在

Linux 中有什么不同,本文档建议您在设置输出文件名之前先设置终端类型:

清单 4. 设置输出和终端类型

set terminal png     # gnuplot recommends setting terminal before output

set output "output.png" # The output filename; to be set after setting

# terminal

replot

现在,文件 output.png

中有了您刚才绘制的图,且可以包含在一个更大的报表中。许多普遍使用的排版和制图程序都有专门的终端,这些程序包括 Adobe

Illustrator(set term aifm)、Corel Draw(set term corel)、AutoCad(set term

dxf)和多种 LaTex 相关的终端(eepic、latex、pstricks、texdraw、tpic 等等)。您还可以得到

PostScript、enhanced PostScript (eps) 或 Adobe PDF 格式的文件。您的 gnuplot

版本可能没有编译所有的终端驱动程序 ―― 例如,Windows 用户不需要 Xll 终端,Linux 用户不需要 Windows

终端。类似地,出于法律原因,gnuplot 4.0 移除了对 gif 终端的支持。

所有终端在能力上都不相同。其中的一

些(如 LaTeX)可能不支持文本的旋转,所以如果您像我们前面那样设置 ylabel,在不同的终端中可能显示不一样。换句话说,您可以在

LaTeX 的特定终端中使用 LaTex 命令。例如,set ylabel "$sin(//theta)$"(注意我们使用两个反斜杠产生一个

LaTex 所需的反斜杠 ―― gnuplot 在将双引号中所括的字符串传送到终端驱动程序之前,先对其进行反斜杠处理)。现在,您可以使用

/input{output.tex} 将输出文件包含在 LaTeX 文件中。要在 PostScript 终端中获得相同的结果,使用相应的

PostScript 命令:{/Symbol q}。在 enhanced PostScript 和 LaTeX 中,您可以使用表示法

x^{superscript} 和 x_{subscript} 得到上标文字。还要注意缩写的终端绘制数据图

虽然本教程只是出于说明目的,大部分内容都集中于绘制正弦曲线,您很可能很想对试验数据、销售数据或其他类似数据绘图。在这一节,我们将使用 IBM 的股票价格作为数据集合说明如何绘制不同的图(本例的原始数据包含在参考资料部分中):

  表 1. IBM 股票价格

大多数数据集合都是数字列,但是这个数据集合有所不同,因为 x 轴是时间数据。下列代码告诉 gnuplot 如何读取和格式化 x 轴上的时间数据(有关详细信息,请参阅 help time/data 和 help set timefmt):

清单 8. 设置时序数据

set xdata time # The x axis data is time

set timefmt "%d-%b-%y"# The dates in the file look like 10-Jun-04

set format x "%b %d"# On the x-axis, we want tics like Jun 10

一旦设置完成,可以使用下列命令对开盘价绘图。我们选择在不同的开盘价之间使用直线插值法,并使用 linespoints 样式,而不只是 points:

plot ["31-May-04":"11-Jun-04"] 'ibm.dat' using 1:2 with linespoints图 8. 绘制开盘价图

象往常一样,["31-May-04":"11-Jun-04"] 显式设置了 xrange,但不是完全必要的。注意范围的 min 和 max 需要指定为符合 timefmt 的字符串。

取决于使用的绘图样式,gnuplot 在绘制一个点时最多可以使用六个不同的编号。当读入记录时,列从 1 开始编号。using 1:2 告诉 plot 命令使用第一列作为 x 轴,第二列作为 y 轴。所以要绘制收盘价图,我们将使用 using 1:5。

每次 gnuplot 看到新的数据分隔符时,列编号就会增加。默认情况下,数据分隔符为空格。所以如果时间格式中间有空格(例如 10 Jun

04,而不是 10-Jun-04),我们将需要使用 using 1:4 代替 1:2。对于 x

轴,我们仅需要指定数据开始的第一列。Gnuplot 能够智能地使用 timefmt 字符串读取其他列。

using

使您可以添加两个以上的冒号,用于指定特定绘图样式可能需要的任何其他列。您还可以使用 $n 表示第 n

列,从而对二进制表达式进行绘图。在一个完全虚构的示例中,我们假设不同的价格表示不同的试验运行,我们要绘制平均价、最高价和最低价。

yerrorbars 样式使您可以绘制 y-high/y-low 值(我们在 using 修饰符中指定为 x:y:ylow:yhigh)以及计算

y 轴四个价格的平均值为 ($2+$3+$4+$5)/4:

plot ["31-May-04":"11-Jun-04"] 'ibm.dat' using 1:($2+$3+$4+$5)/4:4:3 /

title 'daily prices, IBM' with yerrorbars图 9. 计算平均值

errorlines 样式是相似的,但它还在绘制的 y 轴点之间绘制线段。对于绘制财务条形图,Gnuplot

还有单独的样式,分别是最高价、最低价和 tics 在左边,右边为开盘价和收盘价。我们使用 set bars 显示开盘价和收盘价的较大

tics):

set bars 5

plot ["31-May-04":"11-Jun-04"] 'ibm.dat' using 1:2:3:4:5 with financebars图 10. 绘制财务条形图

您还可以查看 help plotting styles 获得其他相关样式,如 candlesticks、boxerrorbars 和错误绘图样式。

处理真实数据集合

当然,对于真实的数据集合,事情可能会变得更复杂。最常见的就是数据集合不使用空格字符分隔数据点。gnuplot 4.0 提供了新的功能,您可以使用 set datafile separator

指定自己的分隔符。同样地,您还可以使用 set datafile commentschar 指定除了 #

之外的注释字符。如果需要更多的控制,您可以为 using 修饰符明确指定格式字符串。Gnuplot 使用 C 标准库的 scanf

函数以及给定格式字符串(有关详细信息,请参阅 help

using)读入数据。我讲述此方法仅是为了内容更全面;能够以此方法读入的数据集合也可以使用 set data file separator

进行处理,或者通过显式指定 using 修饰符中要使用的列编号来进行处理。例如,如果需要忽略第一列中的字符串,则使用 2:3

进行绘图。为了获得更完全的灵活性,在具有 popen 函数的 Unix 类系统中,在将文件传送给 plot

命令之前,可以使用文本处理实用程序对文件进行预处理。例如:plot "< awk --f preprocess.awk

data.file"。不幸的是,该命令不能在所有系统中使用。最后的一个方法是在 gnuplot 中使用输入文件之前对其进行预处理。

有时,真实的数据可能没有包含所有的点 ―― 对于要绘图的列,可能有 x 值,但缺少相应的 y 值。Gnuplot 允许您指定字符串,用于表示缺少的数据点。例如:

set datafile missing 'NaN' # The IEEE floating point not-a-number

注意,在 4.0 版本之前,命令是 set missing 。

不幸的是,处理缺少数据的数据点的方法取决于 using 说明。如果想了解用法 plot 'file'、plot 'file' using

1:2 和 plot 'file' using ($1):($2) 之间区别的详细信息,请参阅 help

using。但是为了安全起见,通常指定列使用显式的 using

格式,如果您想完全清除不合适的数据点,不要使用表达式求值(第三个选项会因为括号而对表达式求值)――

而是,预处理数据文件并用计算的表达式的结果添加确切的列。

往常,您可能以一些无效的数据点而结束。如果 gnuplot

被告知忽略无效数据点,您仍可以对这样的数据集合绘图。Gnuplot 忽略未定义的点,这样当您遇到不合适的点时,技巧就是使用未定义的 y

值,如1/0。类似于 C 的三元算符可以很容易地表达此信息(如果您不熟悉此函数,请参阅 help

ternary;在定义分段函数时它也非常有用)。下面是 help using 中介绍的一个例子,它使您以第二列作为 y 值来绘图,除非第三列大于

10:

plot 'file' using 1:($3>10 ? $2 : 1/0)

高级例子

虽然本文向您展示了会经常使用的大多数命令,但可能有些地方您还需要进一步地研究。在这一节,我们简要讨论其中一些概念,然后提供了其中一个

gnuplot 演示文件(electron.dem)中的脚本,该脚本绘制电子学中常见的幅频响应图,用以说明它们的用法。

用户定义的函数和变量

您可以任意定义自己的复杂函数,如下面的 A(jw)。这些函数可以用参数 (p1, p2) 表示,您可以稍后在 plot 命令中使用它们之前再定义参数变量。

复数

Gnuplot 可以识别复数。{a,b} 表示复数 a+bi。您可以使用函数 abs() 和 arg() 获得绝对值和辐角。

虚变量

当在 plot 命令中使用 sin(x) 时,gnuplot 将 x 用作虚变量,并对它赋不同的值以获得示例。当编写复杂的用户定义的函数时,您可以使用函数定义中使用的传统变量名称,也可以显式设置要使用的虚变量的名称(例如,set dummy jw)。

x2 和 y2 轴

除了常见的沿着曲线图底部和左边的 x 轴和 y

轴之外,还可以使用曲线图的顶部(x2)和右端(y2)作为单独的轴。这些轴都相互独立,可以单独设置范围、tics、标签和比例(例如对数刻度)。而

且,通过使用 axes 子句,plot 命令可以使用不同的轴集合,如 x2y2。默认情况下,plot 命令以 x 轴和 y

轴绘图。当您需要同时绘制范围为不同量级或具有不同单位的线时,此高级功能非常有帮助。在下面的示例中,y 轴绘制振幅,最大值为 1,y2

轴绘制相位,最大值为 100。如果对轴的相同集合绘图,振幅曲线几乎看不出来。

对数刻度

您可以使用 set

logscale 命令以对数刻度绘制任何轴。此命令在轴上绘制以 10 为底的值的对数。您可以显式设置使用的底数(例如,set logscale

2,或如果仅为 x 主轴和 y 主轴设置底数,则可以使用 set logscale xy 2)。

下例摘自与 gnuplot 一起提供的演示文件 electron.dem。此脚本使用了上面讨论的所有高级概念:

清单 9. 幅频响应

A(jw) = ({0,1}*jw/({0,1}*jw+p1)) * (1/(1+{0,1}*jw/p2))

p1 = 10

p2 = 10000

set dummy jw

set grid x y2

set key default

set logscale xy

set log x2

unset log y2

set title "Amplitude and Phase Frequency Response"

set xlabel "jw (radians)"

set xrange [1.1 : 90000.0]

set x2range [1.1 : 90000.0]

set ylabel "magnitude of A(jw)"

set y2label "Phase of A(jw) (degrees)"

set ytics nomirror

set y2tics

set tics out

set autoscale y

set autoscale y2

plot abs(A(jw)), 180/pi*arg(A(jw)) axes x2y2图 15. 振幅和相位频率响应

结束语

在本文中,我们讨论了使用新发布的 gnuplot 4.0 绘制 2D 图形的复杂性。虽然我们接触了大多数的关于使用 gunplot

的重要方面,但限于篇幅有限,我们仍有少数主题没有讨论。值得注意的一些省略范围包括从非常简单的参数函数绘图(请参见 help

parametric)、极坐标(help polar),到曲线拟合(它使用户定义曲线与

linux驱动画点函数,​linux中使用gnuplot使您的数据可视化相关推荐

  1. Linux驱动 简单的Linux驱动基础知识

    Linux驱动 简单的Linux驱动基础知识 一.简述         记--Linux驱动学习笔记. Linux驱动程序初始化硬件设备,并提供硬件控制接口给更上一层的应用调用. 例如使用QT应用程序 ...

  2. Python在Seaborn中手动指定调色板颜色进行数据可视化颜色自定义实战(Manually Specify Palette Colors in Seaborn)

    Python在Seaborn中手动指定调色板颜色进行数据可视化颜色自定义实战(Manually Specify Palette Colors in Seaborn) 目录

  3. linux 驱动 内核模式,Linux内核模块和驱动的编写

    Linux内核是一个整体是结构,因此向内核添加任何东西,或者删除某些功能,都十分困难.为了解决这个问题引入了内核机制.从而可以动态的想内核中添加或者删除模块. 模块不被编译在内核中,因而控制了内核的大 ...

  4. 武汉linux驱动培训转让,linux驱动培训靠谱吗

    作为一名Linux爱好者,在Linux的世界中也算是半个老司机了,从桌面玩到服务器.从ubuntu到centos.从计算机到路由器,各种Linux的花俏玩法都略有体验.作者并非职业Linux选手,我仅 ...

  5. linux驱动访问内存,linux驱动笔记八(内存与IO访问)

    X86处理器中存在I/O空间的概念,I/O空间是相对于内存空间而言的,通过特定的指令in, out 来访问. 目前,大多数嵌入式微控制器如ARM, POWERPC等并不提供I/O空间,而仅存在内存空间 ...

  6. linux驱动程序设计21 Linux设备驱动的调试

    本章导读 "工欲善其事,必先利其器",为了方便进行Linux设备驱动的开发和调试,建立良好的开发环境很重 要,还要使用必要的工具软件以及掌握常用的调试技巧等. 21.1节讲解了Li ...

  7. 【Linux驱动开发】Linux 自带按键驱动

    一.基础 1.以下介绍了 input 子系统的基础,使用的自己编的按键驱动.实际上内核自带了按键驱动(一般默认使能). [Linux驱动开发]INPUT 子系统实验 2.内核自带按键驱动简介 Linu ...

  8. ac3165 linux驱动_为什么Linux系统没有类似Windows上的还原精灵和影子系统?

    很多从Windows转Linux的用户,面临的最大一个问题,就是Linux上没有还原精灵这种软件.众所周知,作为一个操作系统要想普及,绝不可能只针对懂IT的少部分年轻人,而是需要让不同年龄段,不同职业 ...

  9. 【Linux驱动编程】Linux中断上半部和下半部

    前言   cpu在执行程序时,如果有外部中断触发时,如定时器中断.串行总线中断等,cpu停止当前任务从而转去响应中断处理.对于中断函数的处理,原则是尽快处理完事务并退出中断,这一点也比较好理解,尽快处 ...

最新文章

  1. 《数据中台实战》:如何通过标签平台圈出产品高价值用户?
  2. GO 语言websocket编程
  3. vba二维数组初始化_将工作表数据写入VBA数组
  4. 每日一题(20)——malloc与free(一)
  5. 求解多变量非线性全局最优解_一种求解非线性约束优化全局最优的新方法
  6. 程序员必备技能-科学砍需求 1
  7. jQuery size()函数
  8. 回溯2--部分全排列
  9. No module named ‘gym‘
  10. XQuery FLWOR 表达式
  11. 462计算机连接错误,金蝶K3始终462错误,怎么处理???????
  12. 5G仿真-蒙特卡洛仿真方法
  13. Java初级程序员需要知道的基本Java代码规范
  14. 三大云厂商 ARM 架构服务器性能对比
  15. 【商品架构day6】阿里闲鱼亿级商品结构化 - 用技术的力量去降低商户录入成本
  16. win10安装mysql8.0,一台电脑上安装多个mysql
  17. 简单的骨骼动画、骨骼动画理论
  18. 2017/11/6~2017/11/12学习Java总结
  19. Swift - 第三方图表库Charts使用详解23(雷达图)
  20. 想骂人!开发语言不能统一成一个么?

热门文章

  1. Java课程设计-随机组卷程序(仅仅包含选择题)
  2. photoshop效果图
  3. 消息中的wParam和lParam
  4. Android 朋友圈九宫格展示图片
  5. 图解教你打出15种手影
  6. nova-rootwrap笔记
  7. 网站如何记录访客的个人信息?
  8. 纵享丝滑滑动切换的周月日历,水滴效果,丰富自定义日历样式
  9. python中a_谈a++,a--,--a,++a,a+=1,a-=1,在python中是如何的。
  10. 日本政府警告用户慎用谷歌应用程序商店