wgnuplot根据坐标画曲面画图怎样标定一个点

大家一起学习,一起分享知识,一起进步,加油!!
gnuplot画图程序的使用
For my beloved girlfriend CCY, who alwasy use Origin because she is too lazy to read the Gnuplot manual. ^_^ Gnuplot 是一款强大到无敌的跨平台做图工具,可以应付从没事玩玩到写Nature 论文的各种需求,实乃我辈中人之嘲笑 Origin的利器。Gnuplot 可以绘制宇宙 里存在的各种图表,并可以输出为 EPS,
FIG, JPEG, PNG, LaTeX, SVG(!)... 同时,Gnuplot 秉承 UNIX 的优良传统,使用纯文本作为输入,确保它有足够的 表达能力来实现所有功能。最后需要说明的是,Gnuplot 只是名字里恰好有 Gnu, 并不是 GNU 项目的一部分。And
by the way, Origin sucks!
Gnuplot 的官网上有完整的手册和大量范例,值得观摩。
安装Gnuplot
Fedora,CentOS,Redhat系统使用:
sudo yum install gnuplot
Ubuntu,Debian系统使用:
sudo apt-get install gnuplot
使用 Gnuplot
Gnuplot Interactive Environment
First Encounter
Gnuplot 有一个交互式命令界面,在 shell 里输入 gnuplot 回车,就会看到 Gnuplot 打印出一些版本信息,然后显示 gnuplot&,这是它的命 令提示符。下面我们来输入第一个 Gnuplot 命令:
& plot sin(x)
注意第一个 & 字符表示提示符,不要输入。回车后应该会看到 Gnuplot 打开了 一个有工具栏的窗口,里面画着熟悉的正弦曲线。现在试着把这个窗口缩小到一 半大小,怎么样?字看不清了吧?点一下工具栏里的“Apply
autoscale”按钮, 让 Gnuplot 重画窗口。
在上面的例子中,我们已经使用了 Gnuplot 的 plot 命令。在 Gnuplot 中,只 存在两个画图的命令:plot 和 splot。其中 plot 用来画二维图形,splot 用来画三维图形。同时我们还见识 了 Gnuplot 的内置数学函数 sin。
再试一个复杂点的:
& plot sin(x)
+ sin(1.1*x)
貌似和前面的差不多?那是因为我们画出的范围太小。在 plot 命令中,我们可 以手动指定自变量的范围
& plot [-50:50] sin(x)
+ sin(1.1*x)
在 Gnuplot 中,我们使用 [min:max] 这样的语法来定义范围。这次能完整的看 到一拍了。但是有个问题:画出来的图都变成折线了。这是因为Gnuplot 默认取 点太少。对于变化比较平缓的曲线,默认的取点已经足够。如果需要手动指定采 样率的话,可以设置 samples 变量。变量的设置在 Gnuplot 中至关重要,在画 复杂图形的时候,往往会有几十行的变量设置,但画图的命令可能只有最后一行。 我们使用 set 命令设置变量。
& set samples 1000
Gnuplot 绘图需要使用一系列点,并把它们按顺序用直线连接起来。如果需要绘 制的是一个函数,他就会每隔一定的 x
[三维是 (x, y)] 计算出一个函数值,作 为绘图的数据。变量 samples 指定在绘制函数时,我们在绘图区间内取的采样个 数。个数越多曲线越平滑。执行上面的命令后,你会发现曲线并没有变,还是原 来的德性。Gnuplot 不会自动更新曲线(因为如果变量设错了,绘制可能会很 慢),我们需要手动更新。
终于,我们的图形平滑了。
在实际使用的时候,绘制函数图形的需求不大,绘制数据才是最重要的。plot 命令可以读取空格(或 tab)分隔的数据文件,比如下面这个:
# Some data
注意第一行以 # 开头的是注释,会被 Gnuplot 忽略。把这段文本存为 data.txt,然后在 Gnuplot 里执行
& plot "data.txt"
第一行 reset 命令把我们之前设置的所有变量全部设成默认值。执行后会看到 Gnuplot 画出了 5 个点(第一个在左边的纵坐标轴上,红色的,仔细找)。这 个图很丑,数据之间的关系也不明确。你可能会希望把点和点之间用线连起来。 这可以用两种方式完成:
& plot "data.txt" with linespoints
选项 with 指定 Gnuplot 对数据的表示方法,“linespoints” 是其中的一种。如果希望以后的所有对数据的 plot 都是用这种方式,可以设定 style变量:
& set style data linespoints
在 Gnuplot 中有许多 style,比较特殊的是 errorbars 和 candlesticks style,这些 style 需要数据中附加的列来表征多出的维度。
在gnuplot模式下运行linux命令在gnuplot提示符下也可以运行linux命令,但必须在相应的命令前面加上 ! 号。例如,假设很多参量都已经设置好了,但需要对某个数据文件a.dat进行修改后再画图,则可以用如下方式gnuplot&!vi a.dat通过这种方式,所有的linux命令都可以在gnuplot环境里运行。另外,也可以在gnuplot的提示符后输入shell,暂时性退出gnuplot,进入linux环境,做完要做的事情后,运行exit命令,又回到gnuplot环境下。gnuplot&shell
[zxh@theory zxh]$vi a.f
[zxh@theory zxh]$f77 a.f
[zxh@theory zxh]$a.out (假设生成a.dat数据文件)
[zxh@theory zxh]$exit
gnuplot&plot ‘a.dat’ w l
Gnuplot 包含大量的命令和变量,一般的地球人不可能把它们的用法全部记住。 当你忘记了一个变量的用法时,可以查阅手册,但一个更快捷的方法是使用 Gnuplot 的在线文档。Gnuplot 的在线文档包含手册的全部内容,并且方便程度 不亚于 Emacs 的 info-mode。假设我们要查 style 命令的用法, 只需执行
& help style
Gnuplot 就会给出 style 的详细信息。现在假设我们看完后决定试用一种新的 style: impulses。我们对这个 style 一无所知,只是看名字比 较诡异。怎么办?按 q 退出试试,看到了吧?Gnuplot 提示你输入 style 的 subtopic。输入 impulses,就会看到它的介绍了。看完后按 q 退出一层,再按 Ctrl+C 退回提示符。如果一个条目有好几层 subtopics 的话(比如 plot 命令),Gnuplot 就会一层一层的提示你,知道你狂按 C-c 退到提示符为止。
恐怕大部分人对 Origin 最深刻的体会就是不知道在哪里拟合,即使碰巧打开了 一个拟合的窗口,也会发现里面只能线性拟合,然后郁闷地关上。拟合是 Gnuplot 的强项,凭借先进的 UI,gnuplot 的拟合功能可以在两条命令之内完 成,而且可以拟合为任何函数。假设我们想把上面那个数据文件拟合为抛物线, 只需执行
& y(x) = a*x**2 + b*x + c
& fit y(x) "data.txt" via a,b,c
第一条命令定义了一个叫 y 的函数,注意在 Gnuplot 里,求幂的操作符是 **。第二条命令就是传说中的 fit 了。其中的 via 是关键字, 后面跟着需要拟合的变量列表。回车后 Gnuplot 会打印出一大票信息,我们只 需要关心结尾的几行,这里把它贴出来:
Final set of parameters
Asymptotic Standard Error
=======================
==========================
= -0.807933
+/- 0.04386
+/- 0.1894
= -2.04687
correlation matrix of the fit parameters:
0.948 -0.979
其中 “Final set of parameters” 和 “Asymptotic
Standard Error” 是我 们想要的,后面的那个东西...我也不知道是什么...
怎么样?简单吧?我们已经完成了拟合,现在可以把它画出来了。
& plot "data.txt", y(x)
结果很 PP 吧? :-) 这个命令虽然简单,也引入了一些新的东西。现在我们知道怎么在一个图里画 100 条曲线了:用 99 个逗号分隔。
做出专业的图
上面的图虽然很 PP,但是如果你做个这样的图拿给导师,一定会被暴扁一顿然 后到教室/实验室后面罚站 100 天。因为这个图还缺少图例、坐标名称和标题。 当然,严格地说图例已经有了,只是很搓而已。先把这个图例搞好:
& set key right bottom
& plot "data.txt" title "Some Data", y(x) t "~x^2"
一行设置图例的位置在右下角,第二行和前面的 plot 命令的不同 就是给每一个曲线都设置了一个标题,显示在图例中。注意在Gnuplot 中,很多 关键字都有简写,比如这个 title 选项就可以简写为 t。有人说了,你那个 x^2 太呆了,就不能搞成x2 么?当然可以了!Gnuplot 怎么可能那么弱 智... 不过这个问题要放到后面讲 terminal 的时候再说。下面设置坐标名称和 标题:
& set xlabel "t"
& set ylabel "A"
& set title "A Dumb Figure"
这个都能看懂,就不说了。赶快 replot 一下,好看多了吧?赶快 拿给导师。“叔叔... 这是我最新画的图,你看漂漂不?”
Gnuplot Scripting
现在我们已经做出了 PP 图,下一步是什么?有人说了,发给审稿人显摆一下^^。 发个毛啊!你存成 EPS 了么?!所以下一步是把图保存成某种格式。怎么保存呢? 你是不是开始在工具栏里找“保存”按钮了?如果是的话,说明你已经被 M$ 洗 脑了。在 Gnuplot中,我们设置 terminal 变量(可以简写为 term)来指定“保存”的格式。这个变量告诉 Gnuplot 你要以什 么方式/格式来展示图形,默认值为 wxt,表示使用一个 WxWidget 窗口来显示图形。要设置格式为 EPS,我们只需把这个变量设为 postscript (可以简写为 post):
& set term post eps
你是不是看到了一坨乱七八糟的代码?对了。那个就是 Gnuplot 生成的 postscript 代码。term 的选项 eps 指示 Gnuplot 生成一个 Encapsulated
Postscript 文件。当然我们会希望把它保存到一个文件里,这个 可以通过设置 output 变量实现:
& set output "test.eps"
用一个 postscript 查看器/打印机看看生成的文件。
第一个 Gnuplot Script
现在我们已经设置了很多变量,如果你不幸关闭了 Gnuplot,想在下次启动时实 现现在的效果,就要把这些变量重新设置一遍。能不能把这些东西都存到文件里, 让 Gnuplot 一下一起搞定呢?当然可以,而且我一般都是这样使用 Gnuplot 的。 Gnuplot 文件就是一个纯文本,可以用普通的文本编辑器编写。格式也很简单, 只要把我们在 Gnuplot 提示符后面输入的东西照抄一遍就行了。下面是一个简 单的 Gnuplot
# test.gnuset term post eps colorset output "test.eps"set size 0.5, 0.5set xlabel "t"set ylabel "A"set title "A Dumb Figure"plot "data.txt"
在这个文件中,有一个我们没见过的变量 size,这个变量的作用 是设置输出图形的大小为设置前的一定比例。比如 Gnuplot 的Postscript 格式 的默认大小是 10in
x 7in,设置 size 为 0.5,0.5 以后的大小变为 5in
x 3.5in。变量 terminal 的选项 color 指示 Gnuplot 生成带颜色的图形,和在窗 口中看到的一样;也可以指定为 monochrome,不同的曲线将以不 同的线型加以区分。要执行这个文件,只需在 shell 中输入 gnuplot
test.gnu即可。
Teminal, Enhanced
现在我们可以开始解决原来的 "x^2" 问题了。Gnuplot 提供了一种 enhanced termianl 机制来输入这些数学符号,开启后输入 x^2 就会输出成 x2。开启 enhance 的方法是在 terminal 变 量的后面加上选项 enhanced。比如
set term postscript eps color enhanced
set output "test.eps"
set title "x^2 Against {/Symbol b}"
可以去掉的后面的 Against {/Symbol b} 然后就输出指数了plot "data.txt" t "x^2"
其中 {/Symbol b} 输出为一个 β。Enhanced
termianl 还有很多 其他用法,基本可以满足对数学符号的各种需要。使用方法简单,功能强大,非 Origin 之流可比。详细的解释请见 Gnuplot 源码包中附带的 ps_guide.ps。
Gnuplot for Real
在这一节,我们将使用一个实际科研中碰到的例子来讲解 Gnuplot 的使用方法。 考虑这个数据文件,它表征了一个磁性系统的标度行为,在理想情况下应该满足 y = Axβ 的函数关系, 其中 A 为常数。我们的目标是 —— 没有蛀牙!噢,错了,是求出指数 β,并把它清晰的表示出来。
在一开始,我们还不知道该怎样画这个图,先在 Gnuplot 的交互命令行里试着 plot 一下吧^^ 噼里啪啦~~,感觉还行,只是左边挤得太 扁了,什么都看不出来。如果你对这种幂函数比较了解,应该知道如果使用双对 数坐标画图,幂函数的曲线是一条直线,斜率即为幂指数,貌似符合我们的要求, 那就试试双对数坐标吧~~
& set logscale xy
变量 logscale 的用法就不说了,作为作业吧^^。怎么样,画出来以后有没有惊 艳的感觉?现在我们开始拟合:
& y1(x) = A1*x**b1
& y2(x) = A2*x**b2
& fit [0.01:0.3] y1(x) "data.txt" via A1,b1
& fit [3:30] y2(x) "data.txt" via A2,b2
& plot "data.txt", y1(x), y2(x)
看起来还不错,现在我们可以开始写 Gnuplot 脚本了。开头先把变量设了。
set term postscript eps enhanced colorset size 0.8,0.8set output "figure.eps"set logscale xyset style data linespointsset xrange [0.007:40]set yrange [1:50]set key left top
其中 xrange 和 yrange 设置绘图的范围。现在拟合,并把曲线画出来。
y1(x) = A1*x**b1y2(x) = A2*x**b2fit [0.01:0.3] y1(x) "data.txt" via A1,b1fit [3:30] y2(x) "data.txt" via A2,b2plot y1(x) t "{/Symbol b} in low-{/Symbol w} regime" lt 2,
y2(x) t "{/Symbol b} in high-{/Symbol w} regime" lt 3, \
"data.txt" t "Exponential" lw 2 lt 1
注意在 Gnuplot 中,如果一条命令分成了多于一行,要在除最后一行的行末加一 个 \。lw 参数设置曲线宽度为 2,lt 设置曲线的linetype,一般来说 lt
1 是醒目的红色,以上的 plot 参数保证 data.txt 的 曲线在两条直线的上方,并且是红色的实线。现在图画出来了,效果不错,但是 光看这个图还是不知道指数 β 到底是多少,最好是直接把它指明。Gnuplot 提 供了 label 变量(!居然是个变量!),用来在指定的位置添加一段文字。
set label 1 sprintf("{/Symbol b} = %.2f", b1) at 0.09,10 rightset label 2 sprintf("{/Symbol b} = %.2f", b2) at 4.5,8 right
在这里我们使用了 Gnuplot 的内置函数 sprintf,用法就不说啦,相信有大脑 的同学都明白。注意这段要添加在 plot 命令的前面,否则无效,以下所有的变 量设置都是如此。
现在我们的图已经很像回事了,可以最后添加一些装饰~~
set xlabel "{/Symbol w}"set ylabel "A"set title "Exponential relation between A and {/Symbol w}"
大功告成,你可以拿着这个图对用 Origin 的人显摆一下 :-)。
现在,我们对 Gnuplot 提一个难题:把坐标上的数值改成 10n 这种形式,就是说 1 这个刻度显示成 100,10 显示成 101,点点点。这种形式看起来很清晰,很爽快, 很装逼。我们的思路是让 Gnuplot 自己对每一条数据的两个分量都求以 10 为底 的对数,然后把坐标刻度的显示方式变一下。这个好像很变态,其实在Gnuplot 里是一件再简单不过的事:只要设一下 format 变量和 plot 的 using 选项就行 了:
set format "10^{%.1f}"plot "data.txt" using (log10($1)):(log10($2))
这里把那两条拟合的直线省略了。选项 using 的使用比较复杂,这里很难说清楚, 请参阅 Gnuplot 手册。注意这时的坐标应该是线性的,而且我们应该调整绘图范 围:
unset logscaleset xrange [-2.2:2]set yrange [0:1.6]
命令 unset 删去一个变量的值。注意如果一个变量的默认值不是空的,那么 unset 和设为默认值是不一样的。如果你把 xtics 这个变量给 unset 了,画出 来的图就会没有 x 轴刻度,而不是把刻度设为默认的样子。
噢,不对,还没完。这里再补充一句:Origin sucks!
真正的 EOF
【gnuplot-wgnuplot】实例解析使用gnuplot画图的基本方法,以及线型、点型、线的颜色
vs2013中使用gnuplot的一些注意事项
Python产生Gnuplot绘图数据
C/C++中使用GnuPlot
没有更多推荐了,编写Bash Shell通过gnuplot绘制系统性能数据图的方法
转载 &更新时间:日 10:29:22 & 投稿:goldensun
这篇文章主要介绍了编写Bash Shell通过gnuplot绘制系统性能数据图的方法,做到可视化数据收集,需要的朋友可以参考下
使用步骤:
1.设置一个定时任何 执行getperf.sh,采集性能数据
2.将采集到性能数据文件,如:192.168.1.1.tar.gz 解压
3.将性能分析的脚步performance_analyse.sh 放到解压后的目录中
4.安装gnuplot程序(下载)
5.将字体文件夹,拷贝到/usr/share/fonts/目录
6.直接运行 bash performance_analyse.sh
getperf.sh脚本内容如下:
#################################################
# 定义时间TIMES参数,表示采集的次数,
# 采集时间 = TIMES * INTERVAL
# TIMES=180 , INTERVAL=10 采集时间就是半小时
#################################################
#!/bin/bash
TIMES=3600
INTERVAL=2
TIME=`date "+%F %H:%M:%S"`
TAR=`whereis tar|awk -F ":" '{print $2}'|awk '{print $1}'`
SAR=`whereis sar|awk -F ":" '{print $2}'|awk '{print $1}'`
IOSTAT=`whereis iostat|awk -F ":" '{print $2}'|awk '{print $1}'`
# Check Moniter Tool
SysInfo(){
echo "sysip : $SYSIP"|tee $PWD/$SYSIP/sysinfo
echo "starttime : $TIME" |tee -a $PWD/$SYSIP/sysinfo
/sbin/ifconfig &&$PWD/$SYSIP/sysinfo
echo "===================================" &&$PWD/$SYSIP/sysinfo
/usr/sbin/dmidecode &&$PWD/$SYSIP/sysinfo
echo "===================================" &&$PWD/$SYSIP/sysinfo
/bin/cat /proc/cpuinfo && $PWD/$SYSIP/sysinfo
echo "===================================" &&$PWD/$SYSIP/sysinfo
/sbin/fdisk -l && $PWD/$SYSIP/sysinfo
echo "===================================" &&$PWD/$SYSIP/sysinfo
/bin/df -Th &&$PWD/$SYSIP/sysinfo
echo "===================================" &&$PWD/$SYSIP/sysinfo
/usr/bin/free -m && $PWD/$SYSIP/sysinfo
echo "===================================" &&$PWD/$SYSIP/sysinfo
CheckEnv(){
PUB_IP=`/sbin/ifconfig |grep "inet addr" | awk -F: '{print $2}'| awk '{print $1}'|grep -v "172\.\|10\.\|127\.\|192\."|sed -n 1p`
PRI_IP=`/sbin/ifconfig |grep "inet addr" | awk -F: '{print $2}'| awk '{print $1}'|grep "10\.\|127\.\|192\."|sed -n 1p`
if [ "snda$PUB_IP" == "snda" ];then
SYSIP=$PRI_IP
SYSIP=$PUB_IP
if [ -d $PWD/$SYSIP ];then
rm -rf $PWD/$SYSIP
mkdir -p $PWD/$SYSIP
if ! grep iostat /usr/bin/then
yum -y install sysstat
GetPerf(){
CPUUSAGE="$PWD/$SYSIP/cpuusage.log"
MEMUSAGE="$PWD/$SYSIP/memusage.log"
DISKUSAGE="$PWD/$SYSIP/diskusage.log"
NETWORK="$PWD/$SYSIP/network.log"
$SAR -P ALL $INTERVAL $TIMES&& $CPUUSAGE &
$IOSTAT -dkx $INTERVAL $TIMES&& $DISKUSAGE &
$SAR -n DEV $INTERVAL $TIMES&& $NETWORK &
$SAR -r $INTERVAL $TIMES&& $MEMUSAGE &
for ((i=0;i&$TIMES;i++))
sleep $INTERVAL
#在同一台机器上第二次采集数据时,会删除之前采集的数据,重新采集
#采集完成之后,会生产一个以 IP.tar.gz的压缩包。将这个压缩包,放到
#分析脚本performance_analyse.sh 的同级目录。
if [ -d $PWD/$SYSIP ];then
rm -f $SYSIP.tar.gz
tar zcvf $SYSIP.tar.gz $SYSIP
performance_analyse.sh脚本内容如下:
#################################################
这个脚本的作用是处理由性能采集脚本收集到的性能数据
#然后使用gunplot生产直观的性能图。
#################################################
#!/bin/bash
SysInfo(){
local file=$1
local productname="unknow"
local cpumodel="unknow"
local cpucore="unknow"
local cpumhz="unknow"
local physical="unknow"
local realcpucore="unknow"
local diskpart="unknow"
local memory="unknow"
ipaddr=`cat $file |grep -i "net addr"|grep -v "127"`
productname=`cat $file |grep -i "product name"`
cpumodel=`cat $file |grep -i "model name"|uniq -d`
cpucore=`cat $file |grep "processor"|wc -l`
cpumhz=`cat $file |grep -i "cpu MHz"|uniq -d`
physical=`cat $file |grep -i "physical id"|sort -n|uniq -d|wc -l`
realcpucore=`cat $file |grep -i "cpu cores"|uniq -d|awk -F ":" '{print $2}'`
memory=` cat $file |grep -i -EB1 "mem:"`
diskpart=`cat $file |grep -i "disk"|grep -E "[shv][d][a-z]"`
echo "System Information:"|tee -a $REPORTFILE
echo "IP address:"|tee -a $REPORTFILE
echo -e "$ipaddr"|tee -a $REPORTFILE
echo "$productname" |tee -a $REPORTFILE
echo -e "\t$cpumodel" |tee -a $REPORTFILE
echo -e "\tCPU cores\t:$cpucore"|tee -a $REPORTFILE
echo -e "\t$cpumhz"|tee -a $REPORTFILE
echo -e "\tPhysical cpu number:$physical"|tee -a $REPORTFILE
echo -e "\tEach CPU real core:$realcpucore"|tee -a $REPORTFILE
echo "$diskpart"|tee -a $REPORTFILE
echo -e "Memory(MB):\n$memory"|tee -a $REPORTFILE
CpuAllUsage(){
local file=$1
cat $file|grep -i "all"|grep -v -i -E "average|linux|system" &$GNUPLOTFOLDER/sar_cpu.$$
TITLE=`cat $file |sed "/^$/d"|grep -v -i "average|linux"|sed 1d|sed -n 1p`
local SOURCE_SAR_CPU="$GNUPLOTFOLDER/sar_cpu.$$"
local USER_UASGE=`echo $TITLE |awk '{print $3}'`
local NICE_UASGE=`echo $TITLE |awk '{print $4}'`
local SYSTEM_UASGE=`echo $TITLE |awk '{print $5}'`
local IOWAIT_UASGE=`echo $TITLE |awk '{print $6}'`
local STEAL_UASGE=`echo $TITLE |awk '{print $7}'`
local IDLE_UASGE=`echo $TITLE |awk '{print $8}'`
local cpuusagemax=`cat $SOURCE_SAR_CPU|awk '{print $3+$4+$5+$6+$7}'|sort -r|sed -n 1p`
local Tmp_ylable=`echo $cpuusagemax|awk -F "." '{print $1}'`
local ylable=`echo $Tmp_ylable+5|bc`
local cpuusagemin=`cat $SOURCE_SAR_CPU|awk '{print $3+$4+$5+$6+$7}'|sort|sed -n 1p`
local cpuusageavg=`awk 'BEGIN{total=0}{total+=$8}END{print 100-total/NR}' $SOURCE_SAR_CPU`
echo "`date '+%F %H:%M:%S'`: CPU Performance analysis" |tee -a $REPORTFILE
echo -e "\t1.System Cpu load(%) \tmax=$cpuusagemax,average=$cpuusageavg,mim=$cpuusagemin" |tee -a $REPORTFILE
/usr/local/bin/gnuplot --persist &&EOF
set term png size 800,600
#================= Cpu usage area pic ===========
set output "TotalCpuUsage.png"
set key title "Total CPU usage(%)"
set key box 3
set key below
set xlabel "times"
set ylabel "TOTAL CPU USAGE(%)"
set style fill solid 1
set style histogram rowstacked
plot [1:][0:$ylable] '$SOURCE_SAR_CPU' using 3 with histogram lt rgb "#FFB3B3" title "$USER_UASGE",\
'' using 4 with histogram title "$NICE_UASGE",\
'' using 5 with histogram lt rgb "#B3CA7E" title "$SYSTEM_UASGE",\
'' using 6 with histogram lt rgb "#A464BF" title "$IOWAIT_UASGE",\
'' using 7 with histogram title "$STEAL_UASGE",\
'' using 8 with histogram lt rgb "#212121" title "$IDLE_UASGE",\
$cpuusagemax lt 4 lw 2 title "Max Usage ($cpuusagemax%)"
CpuEachCoreUsage(){
local file=$1
sed -i 's/PM//g' $file
local corenu=`cat $file|grep -v -i -E "average|system|all|linux"|sed "/^$/d"|awk '{print $2}'|sort -n -r|uniq -d|sed -n 1p`
echo $corenu
echo ""&$GNUPLOTFOLDER/idle_sum.$$
for (( i=0;i&=$i++ ))
cat $file |grep -v -i -E "average|system|all|linux"|sed "/^$/d"|awk "(\$2==$i){print}"|awk '{print $1 ," ",100-$8}'&$GNUPLOTFOLDER/$i.txt
local idlesum=`awk 'BEGIN{total=0}{total+=$2}END{print total}' $GNUPLOTFOLDER/$i.txt`
echo $i $idlesum &&$GNUPLOTFOLDER/idle_sum.$$
first_load=`cat $GNUPLOTFOLDER/idle_sum.$$|sort -n -k 2 -r|sed -n 1p|awk '{print $1}'`
second_load=`cat $GNUPLOTFOLDER/idle_sum.$$|sort -n -k 2 -r|sed -n 2p|awk '{print $1}'`
third_load=`cat $GNUPLOTFOLDER/idle_sum.$$|sort -n -k 2 -r|sed -n 3p|awk '{print $1}'`
load=($first_load $second_load $third_load)
echo -e "\t2.Each core load:"
local cpuload=("First" "Second" "Third")
local nu=0
for i in ${load[@]}
local coreloadmax=`cat $GNUPLOTFOLDER/$i.txt|sort -n -k 2 -r|sed -n 1p|awk '{print $2}'`
local coreloadavg=`awk 'BEGIN{total=0}{total+=$2}END{print total/NR}' $GNUPLOTFOLDER/$i.txt`
local coreloadmin=`cat $GNUPLOTFOLDER/$i.txt|sort -n -k 2|sed -n 1p|awk '{print $2}'`
echo -e "\t\t\t Load ${cpuload[$nu]} core $i : max=$coreloadmax , avg=$coreloadavg , min=$coreloadmin"|tee -a $REPORTFILE
nu=`echo $nu+1|bc`
for ((i=0;i&=i++))
if [ $i -eq $first_load ];then
elif [ $i -eq $second_load ];then
elif [ $i -eq $third_load ];then
TMP1="$GNUPLOTFOLDER/$i.txt"
TMP2="using 1:2 with l lw $LW"
TMP3="core $i "
PLOT="$PLOT \"$TMP1\" $TMP2 title \"$TMP3\","
local tmp_ylabel_range=`cat $file|grep -v -i -E "average|system|all|linux"|sed "/^$/d"|awk '{print 100-$8}'|sort -n -r|sed -n 1p|awk -F "." '{print $1}'|sed -n 1p`
local ylabel_range=`echo $tmp_ylabel_range+5|bc`
/usr/local/bin/gnuplot --persist &&EOF
#=============== Each core usage =====================
set term png size 800,600
set output "CpuCoreIdle.png"
set key title "Each Core Usage(%)"
set key box 3
set key below
set ylabel "CPU Core Usage(%)"
set xdata time
set timefmt "%H:%M:%S"
plot [:][0:$ylabel_range] $PLOT
MemoryUsage(){
local file=$1
local title=`cat $file |sed '/^$/d'|grep -i -E -v "average|linux"|grep -i mem`
sed -i 's/PM//g' $file
local kbmemused=`echo $title|awk '{print $3}'`
local memused=`echo $title|awk '{print $4}'`
local kbbuffers=`echo $title|awk '{print $5}'`
local kbcached=`echo $title|awk '{print $6}'`
local kbcommit=`echo $title|awk '{print $7}'`
cat $file |sed '/^$/d'|grep -i -E -v "average|linux"|grep -i -v mem|awk '{print $1,$2/1024,($2+$3)/4,$4,$5/4}'&$GNUPLOTFOLDER/memory.$$
SOURCE_FILE=$GNUPLOTFOLDER/memory.$$
local memtotal=`awk 'BEGIN{total=0}{total+=$3}END{print total/NR}' $SOURCE_FILE`
local memusedmax=`awk '{print $4}' $SOURCE_FILE|sort -n -r|sed -n 1p`
local memusedavg=`awk 'BEGIN{total=0}{total+=$4}END{print total/NR}' $SOURCE_FILE`
local memusedmin=`awk '{print $4}' $SOURCE_FILE|sort -n|sed -n 1p`
local memfreemax=`awk '{print $2}' $SOURCE_FILE|sort -n -r|sed -n 1p`
local memfreeavg=`awk 'BEGIN{total=0}{total+=$2}END{print total/NR}' $SOURCE_FILE`
local memfreemin=`awk '{print $2}' $SOURCE_FILE|sort -n|sed -n 1p`
local memcachemax=`awk '{print $7}' $SOURCE_FILE|sort -n -r|sed -n 1p`
local memcacheavg=`awk 'BEGIN{total=0}{total+=$7}END{print total/NR}' $SOURCE_FILE`
local memcachemin=`awk '{print $7}' $SOURCE_FILE|sort -n|sed -n 1p`
local memused_cachemax=`awk '{print $4-$7}' $SOURCE_FILE|sort -n -r|sed -n 1p`
local memused_cacheavg=`awk 'BEGIN{total=0}{total+=($4-$7)}END{print total/NR}' $SOURCE_FILE`
local memused_cachemin=`awk '{print $4-$7}' $SOURCE_FILE|sort -n|sed -n 1p`
local used_percent=`awk 'BEGIN{total=0}{total+=$5}END{print total/NR}' $SOURCE_FILE`
echo "`date '+%F %H:%M:%S'`: Memory usage analysis" |tee -a $REPORTFILE
echo -e "\t\t1.total memory: $memtotal MB"|tee -a $REPORTFILE
echo -e "\t\t2.memory used: max=$memusedmax MB ,avg=$memusedavg MB ,min=$memusedmin MB"|tee -a $REPORTFILE
echo -e "\t\t3.memory free: max=$memfreemax MB ,avg=$memfreeavg MB ,min=$memfreemin MB"|tee -a $REPORTFILE
echo -e "\t\t4.memory cache: max=$memcachemax MB ,avg=$memcacheavg MB ,min=$memcachemin MB"|tee -a $REPORTFILE
echo -e "\t\t4.memory used-cache: max=$memused_cachemax MB ,avg=$memused_cacheavg MB ,min=$memused_cachemin MB"|tee -a $REPORTFILE
/usr/local/bin/gnuplot --persist &&EOF
set term png size 800,600
set output "MemoryUsage.png"
set key title "Memory Use state"
set key box 3
set key below
set ylabel "MB"
set y2label "(%)"
set x2range [0:]
set y2range [0:100]
set xdata time
set timefmt "%H:%M:%S"
set x2set y2
plot '$SOURCE_FILE' using 1:3 w p title "Total Memory",'' using 1:4 w p title "Used",'' using 1:7 w p title "Cached" ,\
'' using 5 with l lt rgb "red" title "memused($used_percent%)" axis x2y2
DiskUsage(){
local file=$1
cat $file |sed "/^$/d"|grep -v -i -E "device|linux"|sed 1d &$GNUPLOTFOLDER/disk.$$
local SOURCE_FILE=$GNUPLOTFOLDER/disk.$$
plot_readiops=""
plot_writeiops=""
local nu=1
echo "`date '+%F %H:%M:%S'`: Disk Performance analysis" |tee -a $REPORTFILE
for diskpart in `cat $file |sed '1,2d'|grep -v -i "device"|awk -F " " '{print $1}'|sort|uniq -d|sed '/^$/d'|grep -E "^[a-z][a-z][a-z]$"`
awk "(\$1==\"$diskpart\"){print}" $SOURCE_FILE &$GNUPLOTFOLDER/gnu_tmpfile.$diskpart
plot_readiops="$plot_readiops \"$GNUPLOTFOLDER/gnu_tmpfile.$diskpart\" using 4 w l title \"$diskpart read IOPS\","
awk "(\$1==\"$diskpart\"){print}" $SOURCE_FILE|awk 'BEGIN{total=0}{total+=$4}END{print total/NR}'&$GNUPLOTFOLDER/t.$$
local read_avg_iops=`cat $GNUPLOTFOLDER/t.$$`
rm -f $GNUPLOTFOLDER/t.$$
awk "(\$1==\"$diskpart\"){print}" $SOURCE_FILE|awk '{print $4}'|sort -n|sed -n 1p&$GNUPLOTFOLDER/t.$$
local read_min_iops=`cat $GNUPLOTFOLDER/t.$$`
rm -f $GNUPLOTFOLDER/t.$$
awk "(\$1==\"$diskpart\"){print}" $SOURCE_FILE|awk '{print $4}'|sort -n -r |sed -n 1p&$GNUPLOTFOLDER/t.$$
local read_max_iops=`cat $GNUPLOTFOLDER/t.$$`
rm -f $GNUPLOTFOLDER/t.$$
plot_writeiops="$plot_writeiops \"$GNUPLOTFOLDER/gnu_tmpfile.$diskpart\" using 5 w l title \"$diskpart write IOPS\","
awk "(\$1==\"$diskpart\"){print}" $SOURCE_FILE|awk 'BEGIN{total=0}{total+=$5}END{print total/NR}'&$GNUPLOTFOLDER/t.$$
local write_avg_iops=`cat $GNUPLOTFOLDER/t.$$`
rm -f $GNUPLOTFOLDER/t.$$
awk "(\$1==\"$diskpart\"){print}" $SOURCE_FILE|awk '{print $5}'|sort -n|sed -n 1p&$GNUPLOTFOLDER/t.$$
local write_min_iops=`cat $GNUPLOTFOLDER/t.$$`
rm -f $GNUPLOTFOLDER/t.$$
awk "(\$1==\"$diskpart\"){print}" $SOURCE_FILE|awk '{print $5}'|sort -n -r |sed -n 1p&$GNUPLOTFOLDER/t.$$
local write_max_iops=`cat $GNUPLOTFOLDER/t.$$`
rm -f $GNUPLOTFOLDER/t.$$
awk "(\$1==\"$diskpart\"){print}" $SOURCE_FILE|awk 'BEGIN{total=0}{total+=$6}END{print total/NR}'&$GNUPLOTFOLDER/t.$$
local avg_read_throughput=`cat $GNUPLOTFOLDER/t.$$`
rm -f $GNUPLOTFOLDER/t.$$
awk "(\$1==\"$diskpart\"){print}" $SOURCE_FILE|awk '{print $6}'|sort -n|sed -n 1p&$GNUPLOTFOLDER/t.$$
local min_read_throughput=`cat $GNUPLOTFOLDER/t.$$`
rm -f $GNUPLOTFOLDER/t.$$
awk "(\$1==\"$diskpart\"){print}" $SOURCE_FILE|awk '{print $6}'|sort -n -r |sed -n 1p&$GNUPLOTFOLDER/t.$$
local max_read_throughput=`cat $GNUPLOTFOLDER/t.$$`
rm -f $GNUPLOTFOLDER/t.$$
awk "(\$1==\"$diskpart\"){print}" $SOURCE_FILE|awk 'BEGIN{total=0}{total+=$7}END{print total/NR}'&$GNUPLOTFOLDER/t.$$
local avg_write_throughput=`cat $GNUPLOTFOLDER/t.$$`
rm -f $GNUPLOTFOLDER/t.$$
awk "(\$1==\"$diskpart\"){print}" $SOURCE_FILE|awk '{print $7}'|sort -n|sed -n 1p&$GNUPLOTFOLDER/t.$$
local min_write_throughput=`cat $GNUPLOTFOLDER/t.$$`
rm -f $GNUPLOTFOLDER/t.$$
awk "(\$1==\"$diskpart\"){print}" $SOURCE_FILE|awk '{print $7}'|sort -n -r |sed -n 1p&$GNUPLOTFOLDER/t.$$
local max_write_throughput=`cat $GNUPLOTFOLDER/t.$$`
rm -f $GNUPLOTFOLDER/t.$$
awk "(\$1==\"$diskpart\"){print}" $SOURCE_FILE|awk 'BEGIN{total=0}{total+=$10}END{print total/NR}'&$GNUPLOTFOLDER/t.$$
local avg_await=`cat $GNUPLOTFOLDER/t.$$`
rm -f $GNUPLOTFOLDER/t.$$
awk "(\$1==\"$diskpart\"){print}" $SOURCE_FILE|awk '{print $10}'|sort -n|sed -n 1p&$GNUPLOTFOLDER/t.$$
local min_await=`cat $GNUPLOTFOLDER/t.$$`
rm -f $GNUPLOTFOLDER/t.$$
awk "(\$1==\"$diskpart\"){print}" $SOURCE_FILE|awk '{print $10}'|sort -n -r |sed -n 1p&$GNUPLOTFOLDER/t.$$
local max_await=`cat $GNUPLOTFOLDER/t.$$`
rm -f $GNUPLOTFOLDER/t.$$
echo -e "\t\t$nu.$diskpart performance:"|tee -a $REPORTFILE
echo -e "\t\t\t read iops:\t\t max=$read_max_iops ,\t avg=$read_avg_iops ,\t min=$read_min_iops"|tee -a $REPORTFILE
echo -e "\t\t\t write iops:\t\t max=$write_max_iops ,\t avg=$write_avg_iops ,\t min=$write_min_iops"|tee -a $REPORTFILE
echo -e "\t\t\t read data per second:\t max=$max_read_throughput KB,\t avg=$avg_read_throughput KB,\t min=$min_read_throughput KB"|tee -a $REPORTFILE
echo -e "\t\t\t write data per second:\t max=$max_write_throughput KB,\t avg=$avg_write_throughput KB,\t min=$min_write_throughput KB"|tee -a $REPORTFILE
echo -e "\t\t\t each io wait time:\t max=$max_await ms ,\t avg=$avg_await ms ,\t min=$min_await ms"|tee -a $REPORTFILE
/usr/local/bin/gnuplot --persist &&EOF
set term png size 800,600
set output "DiskIOPSPerformance.png"
set key title "Disk IOPS"
set key box 3
set key below
set ylabel "IOPS"
plot $plot_readiops $plot_writeiops
NetworkPerformance(){
local file=$1
sed -i 's/PM//g' $file
cat $file |grep -E "eth|em"|grep -v -i "average"&$GNUPLOTFOLDER/network_sourcefile.txt
local sourcefile=$GNUPLOTFOLDER/network_sourcefile.txt
local titlerxpackage=`cat $file |grep -i "IFACE"|awk '{print $3}'|uniq -d`
local titletxpackage=`cat $file |grep -i "IFACE"|awk '{print $4}'|uniq -d`
local titlerxbyte=`cat $file |grep -i "IFACE"|awk '{print $5}'|uniq -d`
local titletxbyte=`cat $file |grep -i "IFACE"|awk '{print $6}'|uniq -d`
if [ $titlerxbyte == 'rxkB/s' ];then
elif [ $titlerxbyte == 'rxbyt/s' ];then
unit="byte"
local rxpackage=''
local txpackage=''
local rxbyte=''
local txbyte=''
local nu=1
echo "`date '+%F %H:%M:%S'`: Network Performance analysis" |tee -a $REPORTFILE
for netcard in `cat $file |grep -E "eth|em"|grep -v -i "average"|awk '{print $2}'|sort|uniq -d`
cat $sourcefile|grep $netcard&$GNUPLOTFOLDER/gnu_network.$netcard
rxpackage="$rxpackage \"$GNUPLOTFOLDER/gnu_network.$netcard\" using 1:3 w l title \"$netcard $titlerxpackage\","
txpackage="$txpackage \"$GNUPLOTFOLDER/gnu_network.$netcard\" using 1:4 w l title \"$netcard $titletxpackage\","
rxbyte="$rxbyte \"$GNUPLOTFOLDER/gnu_network.$netcard\" using 1:5 w l title \"$netcard $titlerxbyte\","
txbyte="$txbyte \"$GNUPLOTFOLDER/gnu_network.$netcard\" using 1:6 w l title \"$netcard $titletxbyte\","
max_rxpck=` cat $GNUPLOTFOLDER/gnu_network.$netcard|sort -n -r -k 3|sed -n 1p|awk '{print $4}'`
avg_rxpck=`awk 'BEGIN{total=0}{total+=$3}END{print total/NR}' $GNUPLOTFOLDER/gnu_network.$netcard`
min_rxpck=` cat $GNUPLOTFOLDER/gnu_network.$netcard|sort -n -k 3|sed -n 1p|awk '{print $4}'`
max_txpck=` cat $GNUPLOTFOLDER/gnu_network.$netcard|sort -n -r -k 4|sed -n 1p|awk '{print $5}'`
avg_txpck=`awk 'BEGIN{total=0}{total+=$4}END{print total/NR}' $GNUPLOTFOLDER/gnu_network.$netcard`
min_txpck=` cat $GNUPLOTFOLDER/gnu_network.$netcard|sort -n -k 4|sed -n 1p|awk '{print $5}'`
max_rxbyt=` cat $GNUPLOTFOLDER/gnu_network.$netcard|sort -n -r -k 5|sed -n 1p|awk '{print $6}'`
avg_rxbyt=`awk 'BEGIN{total=0}{total+=$5}END{print total/NR}' $GNUPLOTFOLDER/gnu_network.$netcard`
min_rxbyt=` cat $GNUPLOTFOLDER/gnu_network.$netcard|sort -n -k 5|sed -n 1p|awk '{print $6}'`
max_txbyt=` cat $GNUPLOTFOLDER/gnu_network.$netcard|sort -n -r -k 6|sed -n 1p|awk '{print $7}'`
avg_txbyt=`awk 'BEGIN{total=0}{total+=$6}END{print total/NR}' $GNUPLOTFOLDER/gnu_network.$netcard`
min_txbyt=` cat $GNUPLOTFOLDER/gnu_network.$netcard|sort -n -k 6|sed -n 1p|awk '{print $7}'`
echo -e "\t\t$nu.$netcard load:"|tee -a $REPORTFILE
echo -e "\t\t\t rxpck/s:\t\t max=$max_rxpck ,\t avg=$avg_rxpck ,\t min=$min_rxpck"|tee -a $REPORTFILE
echo -e "\t\t\t txpck/s:\t\t max=$max_txpck ,\t avg=$avg_txpck ,\t min=$min_txpck"|tee -a $REPORTFILE
echo -e "\t\t\t rxbyt/s:\t max=$max_rxbyt $unit,\t avg=$avg_rxbyt $unit,\t min=$min_rxbyt $unit"|tee -a $REPORTFILE
echo -e "\t\t\t txbyt/s:\t max=$max_txbyt $unit,\t avg=$avg_txbyt $unit,\t min=$min_txbyt $unit"|tee -a $REPORTFILE
nu=`echo $nu+1|bc`
/usr/local/bin/gnuplot --persist &&EOF
set term png size 800,600
set output "NetworkPackagePerformance.png"
set key title "network performance"
set key box 3
set key below
set ylabel "Package/s"
set xdata time
set timefmt "%H:%M:%S"
plot $rxpackage $txpackage
/usr/local/bin/gnuplot --persist &&EOF
set term png size 800,600
set output "NetworkThougtputPerformance.png"
set key title "Throughput performance"
set key box 3
set key below
set ylabel "$unit"
set xdata time
set timefmt "%H:%M:%S"
plot $rxbyte $txbyte
#定义gnuplot的字体msttcore目录及字体,这个在压缩包里有,放到指定目录即可。
export GDFONTPATH="/usr/share/fonts/msttcore"
export GNUPLOT_DEFAULT_GDFONT="arial"
SYSINFO_FILE=sysinfo
CPU_USAGE_FILE=cpuusage.log
MEMORY_USAGE_FILE=memusage.log
DISK_USAGE_FILE=diskusage.log
NETWORK_USAGE_FILE=network.log
REPORTFILE=report.txt
GNUPLOTFOLDER="/tmp/gnuplotlinux"
mkdir -p $GNUPLOTFOLDER
#Time=`date '+%F %H:%M:%S'`
echo -e "\t\t\t\t\t\tSDG Aystem Analysis Report" & $REPORTFILE
SysInfo $SYSINFO_FILE
echo "" && $REPORTFILE
CpuAllUsage $CPU_USAGE_FILE
CpuEachCoreUsage $CPU_USAGE_FILE
echo "" && $REPORTFILE
MemoryUsage $MEMORY_USAGE_FILE
echo "" && $REPORTFILE
DiskUsage $DISK_USAGE_FILE
echo "" && $REPORTFILE
NetworkPerformance $NETWORK_USAGE_FILE
echo "" && $REPORTFILE
#脚本执行完成之后,会在性能数据所在的目录中生成
#report.txt
性能报告文本
#TotalCpuUsage.png
CPU利用率图表
#CpuCoreIdle.png
每个CPU核心的Idle
#MemoryUsage.png
内存使用率
#DiskIOPSPerformance.png
磁盘IOPS性能
#NetworkPackagePerformance.png
网卡发包率性能
#NetworkThougtputPerformance.png 网卡吞吐性能
#################################################
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 gnuplot根据坐标画三维图 的文章

 

随机推荐