分享
 
 
 

LINUX中使用gnuplot让您的数据可视化(2)

王朝system·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

图 7. Multiplot 绘图

绘制数据图

虽然本教程只是出于说明目的,大部分内容都集中于绘制正弦曲线,您很可能很想对试验数据、销售数据或其他类似数据绘图。在这一节,我们将使用 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 "有时,真实的数据可能没有包含所有的点 ―― 对于要绘图的列,可能有 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:($310 ? $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 = 10p2 = 10000set dummy jwset grid x y2set key defaultset logscale xyset log x2unset log y2set 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 nomirrorset y2ticsset tics outset autoscaleyset autoscale y2plot abs(A(jw)), 180/pi*arg(A(jw)) axes x2y2图 15. 振幅和相位频率响应结束语在本文中,我们讨论了使用新发布的 gnuplot 4.0 绘制 2D 图形的复杂性。虽然我们接触了大多数的关于使用 gunplot 的重要方面,但限于篇幅有限,我们仍有少数主题没有讨论。值得注意的一些省略范围包括从非常简单的参数函数绘图(请参见 help parametric)、极坐标(help polar),到曲线拟合(它使用户定义曲线与

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有